VBAでさまざまなことを書けるようになると、複数の機能を組み合わせたマクロ作成ができます。
しかし、マクロが長くなり読みにくくなっていませんか?
マクロが長くなるほど、以下のような問題が発生します。
- 見通しが悪い: どこで何をしているのか、コードをスクロールしないとわからない。
- 再利用しにくい: 「ファイル保存」のコードを別のマクロでも使いたいが、コピペが必要になる。
この問題を解決する「プロシージャ(Sub)の分離」と、機能の塊である Sub を別の Sub から呼び出す Call ステートメントを学びます。
これにより、あなたのコードはプロレベルの管理性を手に入れます。

プロシージャの分離は「機能の部品化」
これまで書いてきた Sub 〇〇() から End Sub までのコードの塊を
VBAでは「プロシージャ」または「Subプロシージャ」と呼びます。
プロシージャの分離とは、メインの処理から「データ整理」「ファイル保存」「メッセージ表示」など、特定の機能だけを独立した別の Sub として切り出すことです。

プロシージャとか呼び方はなんでもいいよ。
Subで囲んだマクロを役割ごとに作ったら便利ってだけ!
1. Callステートメントで部品を呼び出す
分離したプロシージャを実行するには、Call ステートメントを使います。
' 【メイン処理】
Sub Main処理()
' データ抽出処理を行う
MsgBox "抽出処理を開始します", vbInformation
' Callを使って別のプロシージャ(部品)を呼び出す
Call データ集計
Call 最終レポート出力
MsgBox "すべての処理が完了しました", vbInformation
End Sub
' 【機能の部品(切り出したSub)】
Sub データ集計()
' ここにデータ集計に関する具体的なコードを書く
End Sub
Sub 最終レポート出力()
' ここにファイル保存や印刷に関する具体的なコードを書く
End Sub
- 利点:
Main処理を見れば、「集計をして、レポートを出力する」という流れが瞬時に理解できます。詳細なコードは気にしなくて済みます。

まずは、マクロをそのまま呼び出せるようになろう!
これができるようになると、マクロがスッキリするよ。

部品をさらに賢く!引数(ひきすう)の渡し方
プロシージャを分離するだけでは、切り出した部品は融通が利きません。
そこで「この部品を動かすために必要な情報」を、呼び出し元から Subプロシージャへ渡す仕組みが必要です。これが引数(ひきすう)です。
例えば、「ファイル保存」という Sub を作るなら、「保存するファイル名」を引数として渡すことで、どのファイルでも保存できる汎用的な部品になります。

引数って何か理解しなくても大丈夫!
引数も変数も同じようなもの。
この先にある例を見て「なんとなく」理解しよう。
1. 引数の定義と渡し方
| 役割 | 呼び出し側(親) | 受け取り側(子) |
| 指示 | Call ファイル保存(ファイル名) | Sub ファイル保存(ファイル名 As String) |

最初は引数なしでCallを使えれば十分!
(引数ありだと便利だけど)
受け取り側のマクロも
最初から呼び出す想定で変数を設定するのは大変だよ。
であれば、受け取り側のマクロだけでも
利用できる完結したものを用意する方が簡単。
【実例:ファイル名を引数として渡す】
' 【メイン処理】
Sub Main()
' 保存ファイル名を定義
Dim saveName As String
saveName = "月次レポート_" & Format(Date, "yyyymmdd") & ".xlsx"
' Callを使って、ファイル名を引数として渡す
Call ファイル保存(saveName)
End Sub
' 【機能の部品:引数を受け取る側】
Sub ファイル保存(fileName As String) ' 受け取る変数の型を定義
' 引数で受け取ったファイル名を使って保存を実行
ActiveWorkbook.SaveAs Filename:=fileName
' ユーザーへの通知
MsgBox fileName & " のファイル保存が完了しました。", vbInformation
End Sub
- コードの読み方:
ファイル保存という Subプロシージャを呼び出せ。ただし、saveNameという名前の変数の値を、引数として渡す。 Sub ファイル保存(fileName As String): ここで受け取るfileNameは、この Sub の中で変数として利用できるSubプロシージャ内の変数として定義しています。

マクロ「ファイル保存」の変数「fileName」に
Callの引数「saveName」を代入したものを
マクロ「メイン」で動かしているよ。
引数とか言っているけど、
結局はマクロ間を跨いだ変数だよね。

引数を複数渡す
引数は、コンマで区切ることでいくつでも渡すことができます。
' 呼び出し側
Call データ転記("東京", "C:\Data", 100)
' 受け取り側(3つの引数を受け取る)
Sub データ転記(支店名 As String, フォルダパス As String, 件数 As Long)
' 支店名、フォルダパス、件数を使って処理を実行
End Sub
今回のクエストを終えて
Sub 〇〇()はプロシージャと呼ばれ、機能ごとに分離することでコードが管理しやすくなる。- 別のプロシージャを実行するには
Call プロシージャ名を使う。 - 外部の情報を機能の部品に渡す仕組みが引数であり、
Sub 〇〇(変数名 As 型)の形で定義する。 - 引数はコンマでいくつでも繋げられる。
Optionalをつけると省略可能になる。
これで、単なるマクロの記述者から、コードを管理し、再利用可能な「プログラマ」へと進化しました。




コメント