【VBA】ソースをバージョン管理したい!!!!


アイキャッチでも強く主張したい次第。

はじめに

VBAのプログラムは基本小規模のものが多いかと思いますが
それでもバージョン管理したいこと思うことが多々あり。
後述の「text-scripting-vba」を使わせていただく形での対処法をまとめてみました。

前提

  • マクロを仕込んだxlsmファイルがある
  • マクロをxlsmから分離し、gitなどでマクロをバージョン管理したい
  • ここでは分離したマクロをxlsmより一つ上の階層の「VBA_src」フォルダに配置し管理するものとする
  • 事前準備

    まず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 を下記のように編集すること

    このように、どの場所にソースを置くかを「xlsmファイルからの相対パス」で指定する。
    ここでは「一階層上の【VBA_srcフォルダ】」にlibdef.txtファイルを配置することとしている。
    libdef.txtについては後述する。

    また設定完了後、xlsmファイルを開いたときにOfficeのバージョンによっては
    SHORTKEY_RELOADの部分で1004エラーが出ることがある
    その場合は下記のようにハットをとること

    変更前

    変更後

    ソースの移動

    xlsmファイルの上の階層に「VBA_srcフォルダ」を作成する。

    text-scripting-vba-masterフォルダにある
    libdef.txt
    main.bas
    modSample.bas

    をVBA_srcフォルダに移動する。
    libdef.txtを開き

    のように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のマクロが上書きされてしまう。
    うっかりミスでソースが失われてしまうのは非常に痛い。

    まとめ

    問題点に記載しておりますとおり、満点の対処法ではないのですが
    やはりバージョン管理できる恩恵は大きいですね。
    他に良い方法が見つかりましたらまたご紹介できればと思います

    この記事を書いた人

    アバター

    ynarita

    プログラム・サーバ・NWなどコンピュータ関連ならなんでも食べます。
    ゲームをいくら積んでも崩れないゲーマーの河原在住。