日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

ExcelVBA についてのグチ

仕事で小さい ExcelVBA マクロを組む事がしばしばあるのだが色々と思う所をグダグダと書く。

元々は以下のブログにかなり賛同し、自分も何かしら書いてみたくなったのが発端。
Excel VBAつかいまくってるからそろそろ腹にためてることをちょっと書き出すか - oe-roelのカオス落書き帳
ExcelVBA を使う事になった人にとってリンク先記事は一読する価値あると思う。

自分がこれから書く内容は紹介した記事と重なる所もあるがご容赦を。他 VBA でも全く同じかどうかは知らない。

  • If がショートサーキットでない
    • これは紹介した記事でも上の方に書かれており、確かに他言語から来た人は必ず引っかかる罠
    • 複数条件だと And や Or が使えない状況も出てきてどうしても If がネストするんだよなあ
  • Sheet("hoge").Select して操作なんぞするな
    • 操作をマクロ記録すると書かれるのでやりがちだがコピペをコードに組み込む目的でない限り使う必要はない。どうしてもコピペでないと実現できないコードの時に初めて検討すべき。
  • 配列扱いづらい
    • Clojure でなくとも最近の LL かじった人なら concat くらいないんですかと思うのでは
    • 配列使いたい場合は Variant 使うと何かと楽。Excel の列全体や行全体を放り込むのにも便利。
    • え、固定配列とか ReDim?もうそりゃ過去の遺物でしょ
  • 配列定数宣言できないんすか
    • 配列返す関数定義すればほぼ同等の事はできるけど
  • CallByName あるんだが微妙
    • 引数で Variant 渡すと中身でなくどうもポインタ値っぽい Long 数値が渡されるのは仕様?
  • エディタ(VBE)の色付けが貧弱
    • ソースを目視で見直す時は色付け対応したエディタにコピペするとか良くやってる
  • マニアックな情報にたどり辛い
    • Office 組み込みマクロと言う位置づけな以上仕方ないのかもしれないが、ちょっと言語仕様?辺りの根本的な部分を調べたいとなるとググるでは中々たどりつけない。今回紹介したブログも実際なかなか見つけられなかった。
  • Str(num)で固定で先頭に空白入るのどうなん
    • Val があるからまあいいが。VBA の最初の頃は知らんけど後方互換性とかでこのままになってんのかね。
  • RegExp オブジェクトで後方参照使うのめんどくさい
    • Replace メソッドを使う場合は別に何と言う事もないのだが、後方参照だけ使いたい時少し面倒
    • .Net だと RegExp.$1 とかで参照できるようになったとかと言うのをチラと見たような

でも結構良い所もある。

  • 何だかんだで Excel 操作をちょっと自動化させたい目的で使う分にはやっぱり楽
  • インテリセンス
    • たまーに効かない状況もあるが
  • イミディエイトウィンドウ
    • これは lisp で言えば REPL に相当するものだと思ってる
    • 処理単位でプロシージャや関数に細かく分割すればデバッグも容易
      • 使い切りの捨てマクロなら 1 関数でダラダラ処理続けてもいいが後にそれなりに保守する可能性があるなら別に値を返す関数じゃなくプロシージャでも分けるべき
  • コンテキストヘルプはやっぱり良い
  • マクロ操作記録
    • これはコードに残るのである程度参考にはなる。ただ鵜呑みにしてそのまま使う事は自分はあまりない。
  • ブレークポイント、条件ブレーク(ウォッチ式で)、ステップ実行はやっぱり便利
    • 体感的な話だがこれやってると Excel が落ちやすくなるのは何とかならんもんか

言語自体と言うよりは環境面の話ばかりだが、ここはさすが企業製品って所か。.Net からも操作できると言う情報も見かけたが使い易さはどうなんだろ。Clojure CLR から呼び出せるならちょっと興味ある。