vi で書こう VBA (実践編)¶
VBA への障壁¶
2012年初までずーっとVBA を避けていた大きな3つの理由が自分にはありました。
- バージョン管理が難しい
- ソースコードがバイナリ内部に存在し、異なる版の間での差分管理はほぼ不可能
- 外部からの参照引用も非常に難しい。
- 共有ライブラリ化が難しい
- 複数ファイルで利用している同じ内容のモジュールの保守や同期が難しい。
- エディタが選べない
- 好きなエディタ(vi)でソースコード編集ができない。
これは VBA である限り仕方ないのだろうと思い、ならば、Perl の Win32:API から叩く方がいいよね、と思っていた時代が自分にもありました。 (といっても、IEの自動化実行くらいしかやってませんでしたが、)
救世主 発見!!¶
あるとき(2012年2月中旬)、'vba モジュール 共有' で Google ってみると、 id:language_and_engineering さんの Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み) という記事が検索にひっかかってきました。
Note
これには、久し振りに興奮しました:-)
拡張してみました!¶
ということで、 Change の履歴にある通り、id:language_and_engineering さんのコードを参考に独自拡張して VBA: Text Scripting VBA というものを作り、使いはじめました。
追加した機能はざっとこんな感じです。
- 手動リロード関数(reloadModule)を追加した。
- Windows/Mac版どちらの Office でも動作するようにした。
- ライブラリリストについて下記対応を追加した。
- ../ を使った相対指定(例: ../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) でも良いようにした。
- 定数 ENABLE_WORKBOOK_OPEN の値でファイルオープン時の挙動をON/OFFできるようにした。
- このソース自体をexportする関数(exportThisWorkbook)を作成した。
- このExcelファイル自体のUNITテスト用関数を追加してみた。(試験的)
- 標準モジュールだけでなく、クラスモジュールにも対応するようにした。