Excel VBAでマクロを書き始めると、最初は1つのマクロですべての処理を書いてしまいがちです。しかし、処理が増えてくると「どこから呼び出されているのかわからない」「修正したら別の処理が壊れた」といった問題が起きやすくなります。
こうしたトラブルを避けるために欠かせないのが、標準モジュールの正しい呼び出し方です。
標準モジュールは、VBA全体の“司令塔”のような役割を担いますが、呼び出し方や設計を誤ると、かえってコードが複雑になります。
この記事では、標準モジュールとは何かから始まり、Sub / Function の呼び出し方法、引数・戻り値の扱い、実務で壊れにくい設計方法までを丁寧に解説します。
目次
- ✅ 標準モジュールとは何か|役割と基本概念
- ・標準モジュールの特徴
- ・他のモジュールとの違い
- ✅ 標準モジュールに記述したSubの基本的な呼び出し方
- ・Subプロシージャの基本構文
- ・同じ標準モジュール内からの呼び出し
- ✅ Call文は使うべきか?|省略との違い
- ・Call文を使う場合
- ・Callを省略する場合
- ✅ 引数付きSubの呼び出し方法
- ・引数を持つSubの例
- ・Callを使った呼び出し
- ・Callを省略した場合
- ✅ Functionプロシージャの呼び出し方と戻り値
- ・Functionの基本構文
- ・Functionの呼び出し例
- ✅ 別モジュールから標準モジュールを呼び出す
- ・シートイベントからの呼び出し例
- ✅ Public / Private の使い分け
- ・Public Sub
- ・Private Sub
- ✅ 実務でよくある失敗パターン
- ・すべてPublicにしてしまう
- ・Main処理が存在しない
- ・標準モジュールにイベント処理を書こうとする
- ✅ 実務で使える標準モジュール設計例
- ✅ RPA・UiPath連携を意識した設計視点
- ✅ まとめ:標準モジュールの呼び出しを理解してVBAを設計しよう
✅ 標準モジュールとは何か|役割と基本概念
VBAを使っていて「標準モジュール」という言葉は知っていても、実際にどんな役割を持つのかを正確に理解していない方は少なくありません。
特に、ユーザーフォームやシートモジュールと混同したまま使うと、後から修正が困難になります。
・標準モジュールの特徴
標準モジュールは、どのオブジェクトにも依存しない共通処理を記述する場所です。
WorkbookやWorksheetと異なり、イベントに紐づかないため、明示的に呼び出す必要があります。
主な特徴は以下の通りです。
- プロジェクト全体から呼び出せる
- Sub や Function を自由に定義できる
- 共通処理・制御用処理に向いている
- イベントでは自動実行されない
・他のモジュールとの違い
| 種類 | 主な用途 | 呼び出し |
|---|---|---|
| 標準モジュール | 共通処理・制御 | 明示的 |
| シートモジュール | シートイベント | 自動 |
| ThisWorkbook | ブックイベント | 自動 |
| ユーザーフォーム | UI処理 | イベント or 呼び出し |
この違いを理解していないと、「なぜ動かないのか」がわからなくなります。
✅ 標準モジュールに記述したSubの基本的な呼び出し方
VBAで最も基本となるのが、Subプロシージャの呼び出しです。
しかし、ここを曖昧に理解していると、後々の設計で必ず詰まります。
・Subプロシージャの基本構文
Sub SampleProcess()
MsgBox "標準モジュールのSubが実行されました"
End Sub
このSubは、標準モジュールに記述されていることが前提です。
・同じ標準モジュール内からの呼び出し
Sub MainProcess()
Call SampleProcess
End Sub
または
Sub MainProcess()
SampleProcess
End Sub
どちらでも動作しますが、引数がある場合は違いが出るため、後述します。
✅ Call文は使うべきか?|省略との違い
「Callは使わなくていい」と言われることもありますが、実務では使い分けが重要です。
この違いを理解せずに省略だけを使うと、可読性が下がります。
・Call文を使う場合
Call SampleProcess
メリット
- 呼び出しであることが明確
- 引数の指定ミスに気づきやすい
- 可読性が高い
・Callを省略する場合
SampleProcess
注意点
- 引数の括弧ルールが変わる
- 初心者が混乱しやすい
実務では、制御用のMain処理ではCallを使う方が事故が少なくなります。
✅ 引数付きSubの呼び出し方法
標準モジュールを使う最大のメリットは、処理を部品化できることです。
その際に重要になるのが引数です。
・引数を持つSubの例
Sub OutputMessage(ByVal msg As String)
MsgBox msg
End Sub
・Callを使った呼び出し
Sub MainProcess()
Call OutputMessage("処理が完了しました")
End Sub
・Callを省略した場合
Sub MainProcess()
OutputMessage "処理が完了しました"
End Sub
※このとき、括弧は使えません。
この仕様を知らないと、コンパイルエラーになります。
参考:【VBA】ByVal と ByRef の違い|値渡し・参照渡しの理解を深める完全ガイド
✅ Functionプロシージャの呼び出し方と戻り値
Subとの大きな違いは、値を返せるかどうかです。
Functionは、標準モジュール設計では欠かせません。
・Functionの基本構文
Function AddValue(a As Long, b As Long) As Long
AddValue = a + b
End Function
・Functionの呼び出し例
Sub MainProcess()
Dim result As Long
result = AddValue(5, 10)
MsgBox result
End Sub
Functionは、計算処理・判定処理に向いています。
✅ 別モジュールから標準モジュールを呼び出す
実務では、
- シートイベント
- ユーザーフォーム
から標準モジュールを呼び出すケースが非常に多くなります。
・シートイベントからの呼び出し例
Private Sub Worksheet_Change(ByVal Target As Range)
Call MainProcess
End Sub
ポイント
- 標準モジュール側は Public Sub
- イベント側は制御だけにする
✅ Public / Private の使い分け
標準モジュール設計で最も重要なポイントの一つです。
・Public Sub
Public Sub MainProcess()
' 外部から呼び出せる
End Sub
・Private Sub
Private Sub InternalProcess()
' 同一モジュール内のみ
End Sub
実務ルール例
- 外部呼び出し:Public
- 補助処理:Private
これを守るだけで、コードの事故率は激減します。
参考:【VBA】ExcelVBAのPublic変数が参照できない|書く場所|スコープと配置の完全理解
✅ 実務でよくある失敗パターン
この章を読まないと、後で必ず困ります。
・すべてPublicにしてしまう
→ どこからでも呼べてしまい、影響範囲が不明
・Main処理が存在しない
→ 処理の流れが追えない
・標準モジュールにイベント処理を書こうとする
→ そもそも動かない
✅ 実務で使える標準モジュール設計例
Public Sub MainProcess()
Call ValidateData
Call OutputResult
End Sub
Private Sub ValidateData()
' 入力チェック
End Sub
Private Sub OutputResult()
' 出力処理
End Sub
この構成は、
- 処理の流れが一目でわかる
- 修正箇所が限定される
- テストしやすい
というメリットがあります。
参考:【VBA】Dim・Private・Publicの使用方法|変数・プロシージャのスコープを理解
✅ RPA・UiPath連携を意識した設計視点
UiPathなどのRPAとExcel VBAを併用する場合、
「どこを自動化ツールから呼ばせるか」 が重要になります。
その際、
- RPA → MainProcess のみ呼び出す
- VBA内部で細かい処理を分割
という構成にすると、
Excel側の修正がRPAに影響しにくくなります。
これは実務で非常に重要な考え方です。
✅ まとめ:標準モジュールの呼び出しを理解してVBAを設計しよう
- 標準モジュールは共通処理の中核
- SubとFunctionは役割で使い分ける
- Call文は可読性を意識して選択
- Public / Private を設計段階で決める
- MainProcessを入口にすることで保守性が向上
- RPA連携を見据えた設計が後々効いてくる
標準モジュールの呼び出しを正しく理解すると、
VBAは「書き捨てのマクロ」から「設計されたプログラム」へ進化します。
ぜひ、今使っているマクロをこの視点で見直してみてください。