はじめに
VBAでプロジェクトの規模が大きくなると、機能ごとにコードを別の標準モジュールに分割して管理することが多くなります。その際、異なるモジュール間で、偶然同じ名前のマクロ(プロシージャ)を定義してしまう可能性があります。
このような状況でマクロ名だけで呼び出しを行うと、VBAはどのマクロを実行すればよいか分からず、意図しない方のマクロが実行されたり、エラーが発生したりする原因になります。
この記事では、モジュール名を明記することで、どのモジュールにあるマクロを呼び出すのかをVBAに正確に伝え、安全に他のモジュールのプロシージャを実行する方法を解説します。
モジュール名を指定してマクロを呼び出すサンプルコード
この例では、2つの標準モジュールを作成します。
MainModule
: メインの処理を行うモジュール。StringHelpers
: 文字列操作に関する汎用的な関数をまとめた、ライブラリモジュール。
1. ライブラリモジュールを作成
まず、汎用的な関数を格納するモジュールを作成します。モジュールの名前は、プロパティウィンドウで (Name)
を StringHelpers
に変更します。
【標準モジュール: StringHelpers
】
' 文字列の前後に記号を付加する関数
Public Function AddBrackets(ByVal text As String) As String
AddBrackets = "【" & text & "】"
End Function
' 簡単なログを出力するプロシージャ
Public Sub PrintLog(ByVal message As String)
Debug.Print Date & " " & Time & ": " & message
End Sub
2. メインモジュールから呼び出す
次に、MainModule
から、先ほど作成した StringHelpers
モジュールのプロシージャを、モジュール名を指定して呼び出します。
【標準モジュール: MainModule
】
' 他のモジュールのプロシージャを呼び出すメイン処理
Sub RunMainProcess()
Dim formattedText As String
'--- モジュール名を指定して、Subプロシージャを呼び出す ---
Call StringHelpers.PrintLog("処理を開始します")
'--- モジュール名を指定して、Functionプロシージャを呼び出す ---
formattedText = StringHelpers.AddBrackets("重要なお知らせ")
MsgBox formattedText
Call StringHelpers.PrintLog("処理を終了します")
End Sub
実行結果
RunMainProcess
を実行すると、「【重要なお知らせ】」というメッセージボックスが表示され、イミディエイトウィンドウには以下のようなログが出力されます。
2025/08/17 15:11:46: 処理を開始します
2025/08/17 15:11:46: 処理を終了します
コードの解説
Call StringHelpers.PrintLog(...)
これが、他のモジュールのプロシージャを明示的に呼び出す構文です。
StringHelpers.
: 呼び出したいプロシージャが属するモジュール名を、プロシージャ名の前に記述し、ドット (.
) で繋ぎます。Call
:Sub
プロシージャを呼び出す際のキーワードです(省略可能ですが、付けると呼び出しであることが明確になります)。
formattedText = StringHelpers.AddBrackets(...)
Function
プロシージャを呼び出す際も同様に、モジュール名.関数名
という形式で記述します。
なぜモジュール名を指定するのか?
- コードの可読性向上:
StringHelpers.PrintLog
と書かれているだけで、「これは文字列関連のヘルパーモジュールにあるログ出力機能だな」と、コードの意図が格段に読み取りやすくなります。 - 名前の衝突回避: もし
MainModule
の中にもPrintLog
という名前のプロシージャがあったとしても、StringHelpers.PrintLog
と書けば、StringHelpers
モジュールの方が確実に呼び出されます。これにより、意図しない動作を防ぎ、マクロの安定性が向上します。
まとめ
今回は、モジュール名を指定して、他の標準モジュールにあるプロシージャを呼び出す方法を解説しました。
モジュール名.プロシージャ名
という構文で、呼び出し先を明示できる。- これにより、コードの可読性と安定性が向上する。
特に、複数のモジュールで構成される大規模なプロジェクトや、チームで開発を行う際には、このように呼び出し元を明確に記述するコーディングスタイルを徹底することをお勧めします。