処理の一部をサブルーチン化する方法
プロシージャは単体で実行するだけでなく、ほかのプロシージャから呼び出して実行することができます。
いくつもの処理を含む1つの大きなプロシージャを作成するより、処理ごとの1つの小さなプロシージャ(サブルーチン)を作成しておき、呼び出して実行するようにすれば、それぞれのプロシージャが簡潔になり、メンテナンスも容易になります。
Call【コール】ステートメント
任意のプロシージャ内から他のプロシージャを呼び出して実行するには、Call【コール】ステートメントを使用します。
Call【コール】ステートメントの書式と設定値の説明
[]内は諸略可能です。
[Call] name ([引数リスト])
- Call【コール】(省略可)
Call【コール】キーワードを指定します。Call【コール】キーワードは省略してもプロシージャを呼び出すことができますが、キーワードを使用して明示的にサブルーチンを呼び出したほうがわかりやすくなります。 - name【ネーム】(必須)
呼び出すプロシージャの名前を指定します。 - 引数リスト(省略可)
プロシージャに引き渡す変数リスト、配列、または式のいずれかを指定します。複数指定するときは、カンマ (,) で区切ります。
コードと解説
Sub 親プロシージャ() Call サブルーチン1 Call サブルーチン2 End Sub Private Sub サブルーチン1() Range("B2").Value = "Excel" End Sub Private Sub サブルーチン2() Range("B2").Interior.Color = RGB(255, 0, 0) End Sub
親プロシージャで、Call【コール】ステートメントを使用して、サブルーチン1とサブルーチン2プロシージャを呼び出して各プロシージャを実行します。サブルーチン部分は、Private【プライベート】ステートメント利用して作成しておくと、「マクロ」ダイアログボックスに表示されないマクロになります。
実行結果
サブルーチンに引数を設定して呼び出す方法
プロシージャに引数を設定するには、プロシージャ名の後ろのカッコの中に引数名とデータ型をセットにして記述します。
カッコの中の表記は、Dim【デム】ステートメントで変数を宣言するときのようになります。
設定した引数は、プロシージャ内で変数のように扱えます。また、引数を指定してプロシージャを呼び出すにはCallステートメントの引数名の後ろにカッコを付け、カッコ内に渡したい引数の値を記述します。
コードと解説
Sub 親プロシージャ2() Call サブルーチン3(Range("A1:C3"), "Excel") Call サブルーチン4(Range("A1:C3")) End Sub Private Sub サブルーチン3(範囲 As Range, 文字列 As String) 範囲.Value = 文字列 End Sub Private Sub サブルーチン4(範囲 As Range) 範囲.Interior.Color = RGB(0, 255, 0) End Sub
Call【コール】ステートメントを使用して、Private Sub【プライベートサブ】プロシージャの「サブルーチン3」を呼び出します。引数に「サブルーチン3」に渡す値、セル範囲A1セル~C3セルと
文字列の「Excel」を設定します。
3行目【Call サブルーチン4(Range(“A1:C3”))】
Call【コール】ステートメントを使用して、Private Sub【プライベートサブ】プロシージャの「サブルーチン4」を呼び出します。
引数に「サブルーチン4」に渡す値のセル範囲A1セル~C3セルを設定します。
5行目【Private Sub サブルーチン3(範囲 As Range, 文字列 As String)】
サブルーチンとなるプロシージャを「マクロ実行」のダイアログボックスに表示されないようにPrivate【プライベート】ステートメントを利用して作成します。
プロシージャ名の後にカッコをを付けて、親プロシージャのCall【コール】ステートメントの引数に設定した値を受け取ります。変数名のように任意の名前と受け取るデータ型を設定します。
6行目【範囲.Value = 文字列】
Call【コール】ステートメントの引数から受け取った、A1セル~C3セルのセル範囲が格納された「範囲」に「Excel」の文字列が格納された「文字列」を設定します。
8行目【Private Sub サブルーチン4(範囲 As Range)】
サブルーチンとなるプロシージャを「マクロ実行」のダイアログボックスに表示されないようにPrivate【プライベート】ステートメントを利用して作成します。
プロシージャ名の後にカッコをを付けて、親プロシージャのCall【コール】ステートメントの引数に設定した値を受け取ります。変数名のように任意の名前と受け取るデータ型を設定します。
9行目【範囲.Interior.Color = RGB(0, 255, 0)】
Call【コール】ステートメントの引数から受け取った、A1セル~C3セルのセル範囲が格納された「範囲」にセルの背景を表すInterior【インテリア】オブジェクトのColor【カラー】プロパティにRGB関数で色を設定します。
実行結果
引数の「参照渡し」と「値渡し」
VBAでは通常、引数を「参照渡し」という方式で渡します。「参照渡し」とは、引数の値そのものを渡すのではなく引数を参照している形になり、引数として変数を渡し、呼び出した側で値を変更すると呼び出し元の変数の値も変化してしまします。
参照渡しのコード例
Sub 親プロシージャ3() Dim 文字列 As String 文字列 = "Excel" Call サブルーチン5(文字列) MsgBox 文字列 End Sub Private Sub サブルーチン5(文字列 As String) 文字列 = "VBA" End Sub
実行結果
※変数「文字列」に格納された「Excel」が「参照渡し」により「VBA」に変更されました。
「参照渡し」に対して値のみを渡す方式を「値渡し」と呼びます。引数を「値渡し」に設定するには受け取る引数名をByVal【バイバル】キーワードを使用して定義します。
値渡しのコードと解説
Sub 親プロシージャ3() Dim 文字列 As String 文字列 = "Excel" Call サブルーチン5(文字列) MsgBox 文字列 End Sub Private Sub サブルーチン5(ByVal 文字列 As String) 文字列 = "VBA" End Sub
受け取る引数名をByVal【バイバル】キーワードを使用して定義します。
実行結果
以上で、処理の一部をサブルーチン化するCall【コール】ステートメントについての解説を終了します。ありがとうございました。