Excel VBAの管理方法

Excel VBAで記述したプロシージャ/関数を複数個所から参照するときのまとめ

パターン1. 特定の場所にxlsmブックを作り、外部から参照する方法(Application.Run)
メリット:シンプル、管理が楽、修正も容易
デメリット:バージョン管理ができない、大人数で参照すると不安定化する可能性、元のxlsmのパスが移動すると、呼び出し側のパスをすべて変えなければならない

例:Functions.xlsmにcall_msgboxというSubプロシージャ/Functionがあり、他のブックから呼び出すVBAコード
なお、ファイルパスはシングルクォーテーションで囲まれていないとエラーとなる。

    Private Sub CallFunction()
      Const FilePath As String = "C:\Functions.xlsm"
      Const FuncName As String = "call_msgbox"
      Application.Run "'" & FilePath & "'!" & FuncName
    End Sub



パターン2. basファイルをベースに管理し、実行時にxlsm化する方法(VBComponents.Import)
概要:通常xlsmファイルはそのファイル内部のVBAコードを実行する。それに対し、VBAコードが記述されたbasファイルを用意しbasで書かれたプログラムを実行の都度、xlsm内部に当basファイルをインポートしたxlsmファイルを作成することでプログラムを実行する。このとき、basファイルをインポートするにはそれ専用のxlsmファイルかvbsファイルを用いる。 つまり、専用xlsmファイルかvbsファイルをクリックするとbasファイルをインポートしたxlsmファイルができ、コードを実行する流れとなる。xlsmの役割はbasを実行可能形式に変換するだけである。

メリット:basファイルはgithubで管理可能、それにより各フォルダ単位で管理可能となりパス移動問題が生じない、1ユーザー1実行ごとに1xlsmファイルとなるので安定性が高い
デメリット:理解するまでのハードルが高い、組織的に使うのならある程度サポートも必要、コードの修正はVBEではなくテキストファイルであるbasファイルで行うため、メモ帳しか入っていない環境だと少しハードルが上がる。
こちらの方法に関しては別途記述する。