VBAで開発を進めると、複数のファイルで同じような処理を使いたい場面が出てきます。そのたびにコードをコピー&ペーストするのは非効率ですし、修正があった場合にすべてのファイルを更新しなければならず、メンテナンス性が悪化します。
このような課題は、VBAの**Application.Run
メソッド**を使うことで解決できます。このメソッドを使えば、現在開いている別のブックのマクロを、あたかも自分のブックのマクロであるかのように呼び出すことが可能になります。
この記事では、Application.Run
の基本的な使い方から、引数を渡す方法までを解説します。
準備:2つのExcelブック
この機能を試すために、まず2つのxlsm
形式のブックを用意します。
1. 呼び出される側(マクロが保存されているブック)
マクロの置き場所となるブックです。ファイル名をMacroLibrary.xlsm
として保存し、標準モジュールに以下の2つのマクロを記述します。
' ファイル名: MacroLibrary.xlsm
' 引数なしのマクロ
Public Sub SayHello()
MsgBox "別のブックからこんにちは!"
End Sub
' 引数ありのマクロ
Public Sub SaySomething(message As String)
MsgBox "受け取ったメッセージ: " & message
End Sub
2. 呼び出す側(これからコードを記述するブック)
MacroLibrary.xlsm
のマクロを呼び出すためのブックです。ファイル名は任意です(例: DataFile.xlsm
)。
Application.Run の基本構文
Application.Run
の構文は以下の通りです。
Application.Run "'ブック名'!マクロ名", [引数1], [引数2], ...
'ブック名'!マクロ名
: 実行したいマクロの場所を、'ブック名'!マクロ名
という形式の一つの文字列で指定します。ブック名をシングルクォーテーション('
)で囲むのが重要です。[引数...]
: 呼び出すマクロに必要な引数を、カンマ区切りで後ろに続けます。
完成したVBAコード(呼び出し側)
DataFile.xlsm
の標準モジュールに、以下のコードを記述します。MacroLibrary.xlsm
を開いた状態でこのマクロを実行してください。
' ファイル名: DataFile.xlsm
Sub CallAnotherBooksMacro()
' --- 引数なしのマクロを呼び出す ---
' 構文: Application.Run "'ブック名.xlsm'!マクロ名"
Application.Run "'MacroLibrary.xlsm'!SayHello"
' --- 引数ありのマクロを呼び出す ---
Dim messageToPass As String
messageToPass = "これは引数として渡された文字列です。"
' 構文: Application.Run "'ブック名.xlsm'!マクロ名", 引数1, 引数2, ...
Application.Run "'MacroLibrary.xlsm'!SaySomething", messageToPass
End Sub
これを実行すると、まず「別のブックからこんにちは!」というメッセージボックスが表示され、次に「受け取ったメッセージ: これは引数として渡された文字列です。」というメッセージボックスが表示されます。
コードのポイントと注意点
① 呼び出し先のブックは開いておく必要がある
Application.Run
は、現在Excelで開かれているブックのマクロしか実行できません。対象のブックが閉じている状態で実行すると、エラーになります。
② シングルクォーテーションの重要性
'MacroLibrary.xlsm'
のように、ブック名をシングルクォーテーション('
)で囲むことを強く推奨します。ファイル名にスペースやハイフンが含まれている場合、シングルクォーテーションがないと正しく認識されず、エラーの原因となるためです。常に囲む癖をつけておくと安全です。
③ 標準モジュール内のPublicマクロであること
呼び出すマクロは、基本的に標準モジュール内にPublic Sub
として宣言されている必要があります。Private Sub
や、シートモジュール内に書かれたマクロは、この方法では呼び出せない場合があります。
まとめ
Application.Run
メソッドを使えば、VBAのコードを機能ごとに別のブックにまとめて「ライブラリ化」し、様々なファイルからそれを呼び出して使う、といった効率的な開発が可能になります。
Application.Run "'ブック名'!マクロ名", 引数
この構文と、「対象ブックを開いておく」というルールを覚えておけば、コードの再利用性が格段に向上し、VBA開発の幅が大きく広がります。