はじめに
複数のExcelブックを使って業務を回していると、「共通処理をまとめたマクロ用ブックを作り、他のブックからそのマクロを呼び出したい」という場面が出てきます。このようなときに使えるのがApplication.Runメソッドです。
Application.Runを使うと、別のブック(別のプロジェクト)に定義されているマクロを、ブック名を指定して呼び出すことができます。この記事では、Application.Runの基本構文から、引数の渡し方、他ブックが閉じている場合の注意点まで解説します。
Application.Runとは
Application.Runは、指定した名前のマクロ(Subプロシージャ・Functionプロシージャ)を実行するメソッドです。同じブック内のマクロはもちろん、開いている別のブックのマクロも、ブック名を含めて指定することで呼び出せます。
基本構文は以下の通りです。
Application.Run "ブック名.xlsm!マクロ名"
または、引数を渡す場合は以下のように記述します。
Application.Run "ブック名.xlsm!マクロ名", 引数1, 引数2
基本的な使い方
例えば、「共通処理.xlsm」というブックに以下のようなマクロが定義されているとします。
' 「共通処理.xlsm」のThisWorkbookまたは標準モジュールに記述
Sub ShowMessage()
MsgBox "共通処理.xlsmのマクロが実行されました。"
End Sub
このマクロを、別のブック(呼び出し元)から実行するコードは以下のようになります。
Sub CallOtherBookMacro()
' あらかじめ「共通処理.xlsm」を開いておく必要がある
Workbooks.Open "C:\Macros\共通処理.xlsm"
Application.Run "共通処理.xlsm!ShowMessage"
End Sub
Application.Runで呼び出す対象のブックは、事前に開いておく必要があります。閉じたままのブックを直接指定することはできません。
引数付きマクロを呼び出す
Application.Runは、呼び出すマクロに引数を渡すこともできます。以下は、引数として氏名と点数を受け取り、判定結果を表示するマクロの例です。
' 「共通処理.xlsm」側のマクロ
Sub CheckScore(ByVal userName As String, ByVal score As Long)
If score >= 80 Then
MsgBox userName & "さんは合格です。(" & score & "点)"
Else
MsgBox userName & "さんは不合格です。(" & score & "点)"
End If
End Sub
' 呼び出し元のブックのマクロ
Sub CallCheckScore()
Application.Run "共通処理.xlsm!CheckScore", "田中", 85
End Sub
このように、マクロ名の後にカンマ区切りで引数を並べることで、そのまま呼び出し先のプロシージャに値を渡せます。
戻り値を受け取る
呼び出すプロシージャがFunctionプロシージャの場合、Application.Runの戻り値を変数で受け取ることもできます。
' 「共通処理.xlsm」側のFunction
Function CalcTax(ByVal price As Long) As Long
CalcTax = price * 1.1
End Function
' 呼び出し元のマクロ
Sub CallCalcTax()
Dim result As Long
result = Application.Run("共通処理.xlsm!CalcTax", 1000)
MsgBox "税込価格:" & result & "円"
End Sub
Functionの戻り値を使う場合は、Application.Run(...)のように括弧で囲んで記述する点がポイントです。
実務での活用例:共通マクロブックを起動して処理を任せる
複数の担当者が別々のブックを使っている環境で、「集計処理だけは共通マクロブックにやらせたい」というケースを想定した例です。
Sub RunCommonAggregation()
Dim commonBookPath As String
Dim commonBook As Workbook
Dim alreadyOpen As Boolean
commonBookPath = "C:\Macros\集計共通処理.xlsm"
alreadyOpen = False
' すでに開いているか確認
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name = "集計共通処理.xlsm" Then
alreadyOpen = True
Exit For
End If
Next wb
If Not alreadyOpen Then
Set commonBook = Workbooks.Open(commonBookPath)
End If
' 現在のブック名を引数として渡し、集計対象を指定する
Application.Run "集計共通処理.xlsm!AggregateData", ThisWorkbook.Name
MsgBox "集計処理が完了しました。"
End Sub
すでに開いているかどうかをチェックしてから呼び出すことで、二重に開いてしまうトラブルを防げます。
注意点
Application.Runを使う際は、以下の点に注意してください。
- 呼び出し先のブックはあらかじめ開いておく必要がある(閉じた状態のブックは直接実行できない)
- マクロ名の指定を間違えると実行時エラー1004が発生するため、プロシージャ名のスペルミスに注意する
- 呼び出し先のプロシージャが
Privateで宣言されている場合、他ブックから呼び出すことはできない(Publicにするか、省略する) - ファイル名だけでなくフルパスで管理したい場合は、
Workbooks.Openのパスとブック名を変数で一元管理すると保守しやすい
まとめ
この記事では、ExcelVBAのApplication.Runメソッドについて解説しました。
- Application.Runを使うと、開いている別ブックのマクロを名前指定で呼び出せる
- 引数を渡す場合はマクロ名の後にカンマ区切りで指定する
- Functionプロシージャの戻り値を受け取る場合は括弧で囲んで記述する
- 呼び出し先のプロシージャはPublicで、対象ブックは事前に開いておく必要がある
共通処理を1つのマクロブックにまとめておき、Application.Runで各ブックから呼び出す構成にすると、修正が必要になったときも共通ブックだけを直せば済むため、保守性の高いマクロ運用ができます。

コメント