【ExcelVBA・マクロ】Application.Runの使い方|別ブックのマクロを呼び出す方法【コピペOK】

ExcelVBA
スポンサーリンク
スポンサーリンク

はじめに

複数の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で各ブックから呼び出す構成にすると、修正が必要になったときも共通ブックだけを直せば済むため、保守性の高いマクロ運用ができます。

スポンサーリンク
スポンサーリンク
ExcelVBA
シェアする
いがぴをフォローする

コメント

タイトルとURLをコピーしました