アイキャッチでも強く主張したい次第。
はじめに
VBAのプログラムは基本小規模のものが多いかと思いますが
それでもバージョン管理したいこと思うことが多々あり。
後述の「text-scripting-vba」を使わせていただく形での対処法をまとめてみました。
前提
事前準備
まずExcelのオプションから
「VBA プロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックを入れる
text-scripting-vbaをダウンロードする
https://github.com/tcsh/text-scripting-vba
のCode→Download Zipでダウンロードし、解凍する。
マクロの外部化手順
ソースを外部化したいxlsmファイルを開き、開発タブからVisual Basicを起動。
★このとき、対象のxlsmにすでにマクロを書いているならそのソースをすべて適当な外部ファイルに保存しておくこと!
下記作業を実行すると、対象のxlsmファイルの全モジュールが削除される
ThisWorkbookを開き、text-scripting-vbaのsrc/ThisWorkbook.clsの中身を
ThisWorkbookにコピペする。
(そのため既にThisWorkbookにマクロ書いていたら共存させるよう対応が必要)
このときコピーした内容について
FILENAME_LIBLIST を下記のように編集すること
1 2 |
Const FILENAME_LIBLIST As String = "../VBA_src/libdef.txt" 'ライブラリリストのファイル名 |
このように、どの場所にソースを置くかを「xlsmファイルからの相対パス」で指定する。
ここでは「一階層上の【VBA_srcフォルダ】」にlibdef.txtファイルを配置することとしている。
libdef.txtについては後述する。
また設定完了後、xlsmファイルを開いたときにOfficeのバージョンによっては
SHORTKEY_RELOADの部分で1004エラーが出ることがある
その場合は下記のようにハットをとること
変更前
1 2 |
Const SHORTKEY_RELOAD As String = "^r" 'ctrl + r |
変更後
1 2 |
Const SHORTKEY_RELOAD As String = "r" 'ctrl + r |
ソースの移動
xlsmファイルの上の階層に「VBA_srcフォルダ」を作成する。
text-scripting-vba-masterフォルダにある
libdef.txt
main.bas
modSample.bas
をVBA_srcフォルダに移動する。
libdef.txtを開き
1 2 3 |
'main ../VBA_src/main.bas |
のようにbasファイルについて、xlsmからの相対パスを記述する。
libdef.txtに書かれたファイルはxlsmファイル起動時に
moduleとして自動読み込みされる仕組みとなっている。
なお、basファイルはただのテキストファイル。
メモ帳などで.txtとして作成し、拡張子を.basに変えるだけでよい。
マクロのソース移し替え
main.basの中身を、gitなどで管理したいソースに差し替える
複数モジュール必要な場合は
テキストエディタで.basファイルとして保存し、前述のようにlibdef.txtに.basファイルへのパスを記述すること
確認
xlsmファイルをExcelで開き、開発タブからVisual Basicを開き
Moduleにlibdef.txtに書き込んだファイルの中身が入っていることを確認する
※xlsmファイルを開くたびに、xlsmに入ってるモジュールが一旦全削除され
libdef.txtに書かれたファイルをモジュールとして読み直す処理(リロード)が実行される。
※リロードはExcel上でCtrl+Rキーで実行可能。
リロードのショートカットキーは前述のSHORTKEY_RELOADで設定変更可能。
あとはlibdef.txtやbasファイルをgitなどで管理することで
マクロをバージョン管理することができる
問題点
Visual Basic(VBE)でのデバッグ中は同じソースが2か所に存在する形となる
xlsmファイルを開いている間はxlsm上のマクロと.bas上のマクロの二つが存在してしまう。
常に.basファイルだけを編集し、リロードさせて実行、とルール決めすることで問題はないが、
デバッグ実行はVisual Basic上でしかできないため
Visual Basic上でどうしてもソース修正したくなる場面が出てきてしまうのが実情。
なのでVisual Basic上でのみソース修正をし、xlsmを閉じる前にbasファイルにコピー、も妥当ではあるが
誤って「basにマクロをコピーせず」xlsmを閉じてxlsmを開いてしまうと・・・
(ソースが古い)basファイルでxlsmのマクロが上書きされてしまう。
うっかりミスでソースが失われてしまうのは非常に痛い。
まとめ
問題点に記載しておりますとおり、満点の対処法ではないのですが
やはりバージョン管理できる恩恵は大きいですね。
他に良い方法が見つかりましたらまたご紹介できればと思います