今回は、ExcelのVBAで外部モジュールを自ファイルに読み込み、実行する方法をご紹介します。
ExcelVBAを使って簡単なシステムを組むときに、Excelファイル内にモジュール(VBAのコード)を持つと、利用者にモジュールを含むExcelファイルを配信することになりますが、これでは困ることがありますよね?
- モジュールの更新をしたいとき、利用者に配信済みの全てのExcelファイル内のモジュールを更新しなければならない
- 全ての配信ファイルにモジュールを持つと、配信ファイルが無駄に肥大してExcelファイル容量が大きくなる
特に1つ目が問題ですね。
システムアップデートの際に、利用者に配信済みの全てのExcelファイルを上書きするなんて現実的ではありませんね。利用者のパソコン内にあるExcelファイルを更新することになるんですから。
ということで、この問題の解決策をご紹介いたします。
クリックできる目次
外部モジュールExcelアドインファイルを作成
Excelアドインファイルとは、拡張子が「xlam」のファイルです。
通常通りExcelファイルを作成した後、名前を付けてファイルを保存する際に、ファイルの種類で「Excelアドイン」を選択すれば、Excelアドインファイルを作成できます。ファイル名は「sampleAddin.xlam」にします。
作成したExcelアドインファイルを開き、標準モジュール内にModule1(名前は任意)を作成します。
Module1には、次のように書いておきます(サンプルコード)。
Sub TEST() MsgBox "テスト!!" End Sub
外部モジュールを呼び出し用のExcelマクロ有効ブックを作成
作成したExcelアドインファイル内のモジュールを読み込んで、実行するためには、Excelマクロ有効ブックを作成する必要があります。拡張子が「xlsm」のファイルです。
作成方法は、Excelアドインファイル作成と同様に、ファイルの種類で「Excelマクロ有効ブック」を選択して保存するだけです。ファイル名は「sample.xlsm」にします。
次に、作成したExcelマクロ有効ブックを開き、標準モジュール内にModule2(名前は任意)を作成します。
Module2には、次のように書いておきます(サンプルコード)。
Sub SAMPLE() Application.Run "'C:sampleAddin.xlam'!TEST" 'TESTメッセージ表示 End Sub
Excelマクロ有効ブックからExcelアドインファイル内の外部モジュール実行
先ほど作成したsampleAddin.xlamをCドライブの直下に保存します。
次に、sample.xlsm開き、マクロの実行で「SAMPLE」を実行し、以下のメッセージが表示されたら成功です。
これは、sample.xlsmからsampleAddin.xlamのModule1を読み込み、TEST関数を実行した結果です。つまり、ExcelのVBAを使って、外部モジュール(Excelアドイン)を自ファイル(Excelマクロ有効ブック)に読み込み、実行したということになります。
※以下のエラーが出力された場合の対処法
「マクロ ‘ ‘ を実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」
このメッセージが表示された場合は、Application.Runの引数でExcelアドインファイルパスをシングルクオーテーション「”」で括ってください。
NG:”C:sampleAddin.xlam!TEST”
OK:”‘C:sampleAddin.xlam‘!TEST”
まとめ
今回は、ExcelのVBAで外部モジュールを自ファイルに読み込み、実行する方法をご紹介しました。
この方法を使えば、サーバ上に置いたExcelアドインファイル内のモジュールを更新するだけで、Excelマクロ有効ブックの更新は不要になります。
例えば、サーバ上にマスタのExcelマクロ有効ブックがあって、案件毎にマスタからExcelマクロ有効ブックをサーバ内の別フォルダにコピーして、案件毎のオリジナルファイルを作成するような仕組みを構築する際にも、Excelアドイン内にモジュールを持つ方法は有効ですね。