【マクロVBA】別・他のブックのマクロ・プロシージャを実行する方法!ブックが閉じてあっても対応可能

基礎知識

マクロVBAを実行するにあたり、モジュールやシート、ブックなど様々な場所に
マクロを記録・作成することができます。

通常だと、マクロを実行する際には対象のシートに記入してあるプログラム(プロシージャ)を実行すると思いますが、
「別ブックのマクロを実行したい」という場面があったとします。

今回はそのような場合に対応できる「別ブックのマクロを実行する方法」についてまとめています。

対象のブックを開いていなくても実行できるので是非参考にしてみてください。

それでは見ていきましょう。




⬛︎構文の仕組み

Application.Run "'マクロが入っているブックのフルパス'!モジュール名.実行したいマクロ名称"

フルパスとはファイルの保存先の情報+ファイル名になります。
例えば「PC内のローカルディスクCの中の検証用ファイルの中のブックA.xlsxm」の場合は
「C:\検証ファイル\ブックA.xlsm」のようになります。

⬛︎忙しい人向けのコピぺ用プログラム

Sub ブックAのプログラムを実行()

Dim FilePath, ModuleName, ProgramName, FileName

FilePath = "マクロが入っているブックのフルパス"
ModuleName = "モジュール名"
ProgramName = "実行したいマクロ名称"
FileName = Dir(FilePath)

Application.Run "'" & FilePath & "'!" & ModuleName & "." & ProgramName

Application.DisplayAlerts = False
Workbooks(FileName).Close
Application.DisplayAlerts = True
End Sub

⬛︎別・他のブックに記録されているマクロを実行する

では実際に別・他のブックに記録されているマクロを実行してみましょう。

再度構文を見てみましょう。

Application.Run "'マクロが入っているブックのフルパス'!モジュール名.実行したいマクロ名称"

では見本を元に構文に当てはめていきたいと思います。

まず、見本として「ローカルディスクC内の検証用ファイルのブックA」というファイルにある「Module1」の「文字の入力」というマクロがあったとします。

「文字の入力」というマクロの内容はこのようなものです。

Sub 文字の入力()
Cells(1, 1) = "このプログラムはブックAの文字の入力というプログラムです"
End Sub

簡単ですね。
A1に「このプログラムはブックAの文字の入力というプログラムです」と入力するプログラムです。

まず、構文の「マクロが入っているブックのフルパス」から埋めていきましょう。

フルパスとはファイルの保存先の情報+ファイル名になります。
例えば「PC内のローカルディスクCの中の検証用ファイルの中のブックA.xlsx 」の場合は
C:\検証ファイル\ブックA.xlsm」のようになります。

次に構文の「モジュール名」についてです。
こちらに関してはプログラムをどこに記録しているか指定します。
通常のデフォルトであれば「Module」のあとに数値が入力されてありますが、
名前をつけている場合もありますよね。

今回の見本では「Module1」が対象となります。

最後に構文の「実行したいマクロ名」をみていきましょう。
こちらは簡単です。実行したい「プロシージャ名」を入力するのですが、
「Sub」の後に続く文字が対象です。

見本では「文字の入力」というプロシージャ名なので「文字の入力」が当てはまります。

ではプログラムに落とし込んでみましょう。
今回は「ブックB」というファイルにプログラムを入力したいと思います。

ではプログラムが入っている「ブックA」を閉じた状態でプログラムを実行してみます。
結果はこのようになりました。

A1に「このプログラムはブックAの文字の入力というプログラムです」と入力されています。
このことから自動で「ブックA」を開いて、「文字の入力」というプログラムが実行されたことがわかります。

このように「フルパス」「モジュール」「マクロ名」を入力して別・他のブックのマクロを
実行することができました。

⬛︎実行後のファイルを閉じる方法について

先程のプログラムは実行すると、呼び出したマクロを管理しているファイルが開いたままになります。
見本では「ブックA」を開いて実行しているので「ブックA」が開いたままです。

そのまま開いたブックを活用する場合は問題ありませんが、
多くの場合はプログラムを実行した後は閉じるのではないかなと思います。

そこでプログラム実行後は使用したブックを閉じるプログラムを紹介します。

まず、ポイントととしてブックを閉じる際はファイル名のみとなります。
つまり先程フルパスで入力した中からファイル名を抜き出す必要があります。

そこで使用するのが「Dir」になります。
Dirについて詳しく確認したい場合は下記記事を参考にしてみてください☟

【マクロVBA】Dir関数で指定フォルダから対象ファイル・ブックが存在するか確認、処理する!一覧も可 ► 独学エクセル塾 (dokugakuexcel.com)

では使用方法を見てみましょう。

変数 = Dir(フルパス)

これで変数にファイル名のみ抽出することができます。
では先程のプログラムに合わせてみましょう。

結果はこのようになります。

Sub ブックAのプログラムを実行()
Dim FileName As String
FileName = Dir("C:\検証ファイル\ブックA.xlsm")
Application.Run "'C:\検証ファイル\ブックA.xlsm'!Module1.文字の入力"
Application.DisplayAlerts = False
Workbooks(FileName).Close
Application.DisplayAlerts = True
End Sub

これにより、プログラム実行で使用したブックは閉じて終了することができます。

「Application.DisplayAlerts 」はブックを閉じる際に確認のメッセージボックスが表示されるので
表示させないように「False」にします。ブックを閉じた後は通常の状態に戻すため
「True」にしています。

⬛︎補足資料

今回した構文は
Application.Run “‘マクロが入っているブックのフルパス’!モジュール名.実行したいマクロ名称”
のように「フルパス」を使用していました。

しかし、指定フォルダに入れている場合や既に対象ブックが開いている場合は
ファイル名のみでも機能
します。

ただ、問題が1つあります。
例えばあるフォルダに入っている「ブックA」というブックと、デスクトップに保存されている「ブックA」などの
ように、ファイル名が重複する可能性があります。
フォルダ内での同じ名前のブックは保存できませんが、フォルダが異なる場合は同じ名前のブック名で保存できます。

上記を踏まえるとやはりフルパスでの指定が確実だと思います。

ちなみにファイル名のみのプログラムで読み取るブックに優先順位があるか調査しましたが、
規則性は見られませんでした。

⬛︎公式の説明

わかりやすいように説明したため公式と使用する語句が異なりますが
マイクロソフト公式の説明については下記のリンクを参照してください。☟

Application.Run メソッド (Access) | Microsoft Learn

⬛︎まとめ

いかがだったでしょうか。
本内容を活用すると他のブックのマクロを実行できるようになります。

コピぺして、「フルパス」「モジュール名」「マクロ名」を打ち替えて
カスタムしてみてください。

それでは次回の記事でお会いしましょう。

コメント