VBAテクニック集 VBA一覧 呼び出し処理 文法・構文

【VBA】標準モジュールの呼び出し方法とは|Sub・Functionの使い分けと実務設計

Excel VBAでマクロを書き始めると、最初は1つのマクロですべての処理を書いてしまいがちです。しかし、処理が増えてくると「どこから呼び出されているのかわからない」「修正したら別の処理が壊れた」といった問題が起きやすくなります。
こうしたトラブルを避けるために欠かせないのが、標準モジュールの正しい呼び出し方です。

標準モジュールは、VBA全体の“司令塔”のような役割を担いますが、呼び出し方や設計を誤ると、かえってコードが複雑になります。
この記事では、標準モジュールとは何かから始まり、Sub / Function の呼び出し方法、引数・戻り値の扱い、実務で壊れにくい設計方法までを丁寧に解説します。

✅ 標準モジュールとは何か|役割と基本概念

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は「書き捨てのマクロ」から「設計されたプログラム」へ進化します。

ぜひ、今使っているマクロをこの視点で見直してみてください。

参考:【VBA】同じ処理を効率的に呼び出す方法(関数・Sub の活用)

    -VBAテクニック集, VBA一覧, 呼び出し処理, 文法・構文