今回はApplication.Runを使ってマクロを呼び出して実行する方法を備忘録も兼ねて残しておきたいと思います。
マクロを呼び出して実行する方法
実行する環境
まず初めに実行する環境について紹介しておきます。
使用するのは呼び出し元のファイルと呼び出し先のマクロが入っているファイルの2つになります。
今回test_ApplicationRun.xlsm
というマクロブックからmsg_haribona.xlam
のharibona_xlam_test
プロシージャを呼び出す、というのをやってみたいと思います。

なお、呼び出し元のファイルと呼び出し先のマクロが入っているファイルが同じ階層にある状態で説明していきます。

xlamについては以下記事で紹介していますので、よければこちらもご覧ください!
コードの紹介
それではコードを紹介します。
なお、コードは呼び出し元のファイルに記述してください。
(ワークシートでも標準モジュールでもどちらでもOKです)
'マクロの実行【xlamの場合】
Sub test_ApplicationRun_xlam()
Dim targetAppFullName As String
Dim targetAppFileName As String
Dim targetAppMacroName As String
'呼び出し先のファイル名
targetAppFileName = "msg_haribona.xlam"
'呼び出し先のファイルに入っているマクロ名
targetAppMacroName = "haribona_xlam_test"
'パスとファイル名とマクロ名を指定の形にする
targetAppFullName = "'" & ThisWorkbook.Path & "\" & targetAppFileName & "'" & _
"!" & targetAppMacroName
'マクロを呼び出して実行する
Application.Run targetAppFullName
End Sub
実行するとmsg_haribona.xlam
のharibona_xlam_test
が呼び出せているのが分かると思います。

コードの説明
次にコードの説明をします。
とは言っても、targetAppFileName
やtargetAppMacroName
はそれぞれファイル・マクロ名を格納しているだけなのでさして問題ではありません。
'呼び出し先のファイル名
targetAppFileName = "msg_haribona.xlam"
'呼び出し先のファイルに入っているマクロ名
targetAppMacroName = "haribona_xlam_test"
ですがtargetAppFullName
に格納する処理は若干複雑なので、こちらに焦点を当てて説明したいと思います。
'パスとファイル名とマクロ名を指定の形にする
targetAppFullName = "'" & ThisWorkbook.Path & "\" & targetAppFileName & "'" & _
"!" & targetAppMacroName
targetAppFullName
はコメントにもある通り、呼び出し先のファイルが格納されているパスとファイル・マクロ名を格納する為の変数になっています。
ですが、ただパスとファイル・マクロ名を記述すればいいわけではなく、指定された形にしなければ上手く動いてくれません。

じゃあ指定の形って何???
となる方もいると思います。
指定の形とは、「‘【呼び出し先のファイルパス】’!【呼び出し先のマクロ名】」になります。
言語化すると、
- 呼び出し先のファイルパスを「”(シングルクォーテーション:半角)」で囲む。
- 「!(びっくりマーク:半角)」を入力し、後ろに呼び出し先のマクロ名を指定する。
といった感じになります。
今回の場合の変数を展開してみると以下のようになります。
(パスの部分は省略)
'パスとファイル名とマクロ名を指定の形にする:展開後
targetAppFullName = "'" targetAppFileName & "'" & "!" & targetAppMacroName
= "'msg_haribona.xlam'!haribona_xlam_test"
・・・とこんな感じでファイル名とマクロ名を区切っておく必要があるわけです。
慣れるまでは大変ですが、これを守らないとマクロが呼び出せなくなっちゃうので注意してください。
指定の形にできたら、あとはApplication.Run
で呼び出してあげればOKです。
'マクロを呼び出して実行する
Application.Run targetAppFullName
別のマクロブック内のマクロも実行できる
今回は例としてxlam
形式のファイルの場合の呼び出し方を紹介しましたが、xlsm
形式(マクロブック)に含まれているマクロを呼び出すことも可能です。
例としてtest_ApplicationRun.xlsm
からmsg_getLastRow.xlsm
のtest_LastRow
プロシージャを呼び出す、というのをやってみたいと思います。

呼び出し元のファイル(test_ApplicationRun.xlsm
)に記述するコードは以下の通りです。
'マクロの実行【xlsmの場合】
Sub test_ApplicationRun_xlsm()
Dim targetAppFullName As String
Dim targetAppFileName As String
Dim targetAppMacroName As String
'呼び出し先のファイル名
targetAppFileName = "msg_getLastRow.xlsm"
'呼び出し先のファイルに入っているマクロ名
targetAppMacroName = "test_LastRow"
'パスとファイル名とマクロ名を指定の形にする
targetAppFullName = "'" & ThisWorkbook.Path & "\" & targetAppFileName & "'" & _
"!" & targetAppMacroName
'マクロを呼び出して実行する
Application.Run targetAppFullName
End Sub
次に呼び出し先のファイル(msg_getLastRow.xlsm
)のコードは以下の通りです。
'最終行の取得
Sub test_LastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
MsgBox lastRow
End Sub
こちらのコードについては以下記事で紹介していますので、よければこちらもご覧ください!
実行すると呼び出し先のファイル(msg_getLastRow.xlsm
)が開かれ、呼び出し元ファイルの最終行を取得し、メッセージボックスが表示されます。

こんな感じでマクロブックから別のマクロブック内のマクロを呼び出すこともできちゃいます。
まとめ
今回はApplication.Runを使ってマクロを呼び出して実行する方法を紹介しました。
ファイル毎にマクロを分割しているときなどに役立つので、是非覚えておきましょう!
また、このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!
コメント