コードを機能ごとに「部品化」する!Callで呼び出そう

Level5 VBA・マクロ

VBAでさまざまなことを書けるようになると、複数の機能を組み合わせたマクロ作成ができます。

しかし、マクロが長くなり読みにくくなっていませんか?
マクロが長くなるほど、以下のような問題が発生します。

  1. 見通しが悪い: どこで何をしているのか、コードをスクロールしないとわからない。
  2. 再利用しにくい: 「ファイル保存」のコードを別のマクロでも使いたいが、コピペが必要になる。

この問題を解決する「プロシージャ(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 をつけると省略可能になる。

これで、単なるマクロの記述者から、コードを管理し、再利用可能な「プログラマ」へと進化しました。

コメント

タイトルとURLをコピーしました