まずはこいつから。ライブラリ本体には興味ないけどこいつは要る、という話もあるとかないとか。
Ariawase is free library for VBA cowboys.
vbac は、フリーの VBA ライブラリ Ariawase に同梱されるツールで、各種のマクロ有効 Office ファイルから VBA コードをエクスポートしたり、あるいは逆にインポートしたりするためのものです。VBA のソースコードを git などでバージョン管理するために、また Emacs や Vim や Sublime Text あるいはサクラエディタなどの任意のエディタで VBA を編集するために、さらに grep や diff のような外部コマンドとの連携を図るために使用できます。
本ツールは、Word ファイル(doc、dot、docm、dotm)、Excel ファイル(xls、xla、xlt、xlsm、xlam、xltm)、Access ファイル(mdb、accdb)に対応しています。Outlook(otm)に関してはその仕様によりサポートができません。PowerPoint については、現状で対応していませんが、単に僕にとって必要ないというだけなので、もしご要望があれば実装します。あと Access adp も今のところ未対応です。
vbac を使用するにあたり、最初にやっておかなければならない設定があります。vbac は VBA プロジェクトにアクセスするので、Word、Excel では、セキュリティ設定を変更する必要があります。Office のバージョンによって設定場所が違いますが、2013 を例に取れば、[オプション]-[セキュリティ センター]-[セキュリティ センターの設定...]-[マクロの設定]から、[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する]のチェックをオンにします。
使い方です。vbac は、vbac.wsf という単一の WSH スクリプト(実装言語は JScript)です。コマンド プロンプトから以下のような形式で実行します。
cscript //nologo vbac.wsf ...
help コマンドを実行すると、あんちょこ程度の簡単なヘルプメッセージを表示します。
>cscript //nologo vbac.wsf help
vbac (version 0.6.0)
Usage: cscript vbac.wsf <command> [<options>]
Commands:
combine Import all VBComponents
decombine Export all VBComponents
clear Remove all VBComponents
help Display this help message
Options:
/binary:<dir> Specify directory of macro-enabled Office files
(default: bin)
/source:<dir> Specify directory of source code files
(default: src)
/vbaproj Use .vbaproj file
/dbcompact With Access DB compaction
それでは実例として、Book1.xlsm から VBA コードをエクスポートしてみます。基本的には、フォルダ構成を以下のようにします。任意のフォルダ(ここでは Book1 とします)に vbac.wsf を置いて、同階層に bin フォルダを作成して対象となる Office ファイル(Book1.xlsm)を格納する、という形です。
Book1
│ vbac.wsf
│
└─bin
Book1.xlsm
エクスポートには decombine コマンドを使用します。Book1.xlsm には、Class1 クラス モジュール、Module1 標準モジュール、Sheet1 シート モジュールが含まれるものとすると、以下のようになります。
>cscript //nologo vbac.wsf decombine
begin decombine
> Target: Book1.xlsm
- Export: Class1.cls
- Export: Module1.bas
- Export: Sheet1.cls
end
decombine は、src フォルダを作ってそこに対象の Office ファイルと同名となる Book1.xlsm フォルダを作成し、その中に VBA ソース ファイルをエクスポートします。
Book1
│ vbac.wsf
│
├─bin
│ Book1.xlsm
└─src
└─Book1.xlsm
Class1.cls
Module1.bas
Sheet1.cls
では逆に、src\Book1.xlsm フォルダ内の VBA ソース ファイルを bin\Book1.xlsm にインポートしてみます。これには combine コマンドを使用します。
>cscript //nologo vbac.wsf combine
begin combine
> Target: Book1.xlsm
- Import: Class1.cls
- Import: Module1.bas
- Import: Sheet1.cls
end
combine は、bin\Book1.xlsm ファイルの内容を上書きします。あるいは、bin に Book1.xlsm ファイルが存在しなかった場合には、新しいファイルを作ってインポートを行います。
ここで重大な注意点があります。このインポート処理は、bin\Book1.xlsm ファイルに存在する VBA コードがいったんすべて削除された後で行われます。つまり、src 側にはないモジュールが bin 下の Office ファイルに存在したとすると、それらは消されてなくなってしまう、ということです。
この注意点は、combine だけでなく decombine にも当てはまります。エクスポート処理においても同様に、その前処理として、src\Book1.xlsm フォルダに存在する VBA ソース ファイルがすべて削除されます。これは、VBA ソース ファイルに対してだけ行われるのであり、何か他の、たとえば txt ファイルがあったとしてもそれは単純に無視されます。
つまり combine と decombine は、単にインポート・エクスポートを行うのでなく、いわば同期(ファイル同期)を行うためのコマンドであるということです。
これを踏まえて、X.xlsm と Y.xlsm の2つのファイルから VBA コードをエクスポートして、それらをまとめて新しいファイル Z.xlsm にインポートする、コード統合作業について考えてみます。vbac は複数の Office ファイルに対応します。ですから、まず X.xlsm と Y.xlsm の両方を bin フォルダに格納して decombine します。すると、src\X.xlsm および src\Y.xlsm フォルダに VBA ソース ファイルが作成されます。両フォルダに作成されたファイルを、新しく src\Z.xlsm フォルダを作ってそこにコピーし、今度は combine します。そうすると、2ファイルの VBA コードを統合した bin\Z.xlsm ファイルを得ることができます。
さて、ここまでを箇条書きでまとめます。
- vbac.wsf と同じ階層に bin フォルダと src フォルダを持つ
- bin フォルダには Office ファイルを格納する
- src フォルダには VBA ソース ファイルを格納する
- エクスポートは decombine コマンドを使用する
- インポートは combine コマンドを使用する
- combine および decombine は VBA コードを同期する
- vbac は複数の Office ファイルにも対応
あとはだいたいおまけ。bin とか src って名前じゃなく違うフォルダを指定したい場合には、/binary および /source オプションを使用します。/binary:Debug\bin のように、コロン区切りでフォルダ パスを指定します。フォルダ パスには絶対パスおよび相対パスが指定でき、相対パスは vbac.wsf が置かれているフォルダを起点とします。
cscript //nologo vbac.wsf combine /binary:Debug\bin /source:code
対象が Access ファイルである場合、/dbcompact オプションを使用すれば、事後処理として[データベースの最適化/修復]をあわせて行うことができます。
cscript //nologo vbac.wsf combine /dbcompact
/vbaproj はちょっとしたオプションです。これを付加して decombine すると、src\Book1.xlsm フォルダに App.vbaproj というファイルが作成されます。これはいわゆるプロジェクト ファイルです。中身は素朴な ini ファイル形式になっていて、プロジェクト プロパティおよび参照設定の情報が出力されます(ただし条件付きコンパイル引数を除く。API がない)。
cscript //nologo vbac.wsf decombine /vbaproj
そして、combine 時に /vbaproj を指定すれば、App.vbaproj に出力されたプロジェクト プロパティと参照設定が bin\Book1.xlsm に復元されます。なお、参照設定の復元に関しても、既存の参照がすべて削除された上で行われますので注意してください。
あまり使う機会はないかもしれませんが、clear コマンドについても紹介しておきましょう。このコマンドは、bin\Book1.xlsm ファイルが含む VBA コードをすべて削除します。
>cscript //nologo vbac.wsf clear
begin clear
> Target: Ariawase.xlsm
- Remove: Class1
- Remove: Module1
- Remove: Sheet1
end
最後に、vbac を使用して git など VCS で VBA を管理する上での Tips です。ここまでの内容で気づかれた方もいるかもしれませんが、vbac.wsf は、案件ごとのフォルダに1つ置いて使用するよう設計されています。リポジトリには vbac.wsf を含めてコミットするのがよいでしょう。
また、特に Excel でその傾向が強いように思いますが、VBA は Office ドキュメント(ワークシート)の内容と一体となって動くものが多いです。そのため、src フォルダ内の VBA ソース ファイルだけでなく bin フォルダに格納した Office ファイルも一緒に、リポジトリにコミットしておいた方がよいかもしれません。
さて、つらつらと解説して参りましたが、vbac は我ながら本当に便利なツールに仕上がっていると思います。VBAer 必携のツールです。ぜひ使ってみてください。
余談。
実は vbac には隠し機能があります。疑り深いあなたのために、combine 時に bin の内容をバックアップするための /binback オプションと、Access ファイルのクエリも管理対象にしたい人のための /incquery オプションです。これらオプションは、実装はされているものの無効化されています。vbac.wsf のソースのずっと下の方で無効化処置が行われていますので、これらを使いたい方は、対応する無効化箇所をコメントアウトして有効化してください。
// It's guard for internal impl. If necessary, you can comment out to enable this feature.
param.binbak.flag = false;
param.incQuery = false;
/binbak オプションに関して、バックアップは vbac.wsf と同階層の bak フォルダに作成されます。別の場所にバックアップしたい場合は /binbak:tmp などと指定することもできます。