vi で書こう VBA (実践編)

VBA への障壁

2012年初までずーっとVBA を避けていた大きな3つの理由が自分にはありました。

バージョン管理が難しい
  • ソースコードがバイナリ内部に存在し、異なる版の間での差分管理はほぼ不可能
  • 外部からの参照引用も非常に難しい。
共有ライブラリ化が難しい
  • 複数ファイルで利用している同じ内容のモジュールの保守や同期が難しい。
エディタが選べない
  • 好きなエディタ(vi)でソースコード編集ができない。

これは VBA である限り仕方ないのだろうと思い、ならば、Perl の Win32:API から叩く方がいいよね、と思っていた時代が自分にもありました。 (といっても、IEの自動化実行くらいしかやってませんでしたが、)

救世主 発見!!

あるとき(2012年2月中旬)、'vba モジュール 共有' で Google ってみると、 id:language_and_engineering さんの Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み) という記事が検索にひっかかってきました。

../_images/20120831-vba.022.png

Note

これには、久し振りに興奮しました:-)

拡張してみました!

ということで、 Change の履歴にある通り、id:language_and_engineering さんのコードを参考に独自拡張して VBA: Text Scripting VBA というものを作り、使いはじめました。

追加した機能はざっとこんな感じです。

  1. 手動リロード関数(reloadModule)を追加した。
  2. Windows/Mac版どちらの Office でも動作するようにした。
  3. ライブラリリストについて下記対応を追加した。
  • ../ を使った相対指定(例: ../common/hoge.bas)への対応
  • パス区切りなしの指定(例: hoge.bas)への対応
  • 絶対指定への対応
    • "drivename:" & chr(92)
    • chr(92) & chr(92) & "server" & chr(92)
    • /hoge
    • :hoge
  • パス区切り文字について、Windowns(chr(92))/Mac(:)/UNIX(/) のどれを使っても良いようにした。
  • 改行コードが Cr(Mac) でも CrLf(Windows) でも良いようにした。
  1. 定数 ENABLE_WORKBOOK_OPEN の値でファイルオープン時の挙動をON/OFFできるようにした。
  2. このソース自体をexportする関数(exportThisWorkbook)を作成した。
  3. このExcelファイル自体のUNITテスト用関数を追加してみた。(試験的)
  4. 標準モジュールだけでなく、クラスモジュールにも対応するようにした。