目標
Subプロシージャ・Functionプロシージャ・イベントプロシージャの違いを確認する
Excel VBA の「ByVal(値渡し)とByRef(参照渡し)」を理解して利用できる
3つのプロシージャの概要
3つのプロシージャの概要
Subプロシージャ
Subプロシージャは各種モジュールの中で実行されるプログラムです。ワークシートに設置したフォームコントロールボタンなどに「マクロの登録」をする場合はSubプロシージャである必要があります。
Functionプロシージャ
Functionプロシージャは他のプロシージャに呼び出されて実行されるプログラムです。Subプロシージャもサブルーチンとして呼び出して実行できますが、Functionプロシージャの特徴は戻り値(処理が動いた後に生成された値を返す機能)を利用できることです。FunctionプロシージャはVBAプログラムとして動かす以外にワークシート関数としても利用ができます。
SubプロシージャとFunctionプロシージャの違いをまとめると次のようになります。
Subプロシージャ | Functionプロシージャ | |
マクロの登録 | 〇 | × |
他プロシージャからの呼び出し | 〇 | 〇 |
引数の利用 | 〇 | 〇 |
戻り値の利用 | × | 〇 |
ワークシート関数として利用 | × | 〇 |
引数については下の「引数付きサブルーチンの概要と利用方法」を参考にしてください。
イベントプロシージャ
イベントプロシージャはシートの選択やマウスクリックなどをきっかけにして動くプロシージャのことです。
「ByVal」と「ByRef」の概要と利用方法
Excel VBA の「ByVal」と「ByRef」とは
呼び出されるプロシージャやイベントプロシージャでは引数を利用するケースがあります。この引数にはByValで設定する「値渡し」とByRefで設定する「参照渡し」があります。引数が利用される場合は基本的に次の2つです。
❶「Subプロシージャ(サブルーチン)やFunctionプロシージャが他のプロシージャに呼び出される場合」(人がプログラミングで設定します。)
❷「イベントプロシージャを利用する場合」(自動で設定されます。)
ByValとは
ByValで設定した変数は「値のコピーを渡す」といった動きをします。コピーされた値は呼び出されたプロシージャ内で利用されます。
下の図では呼び出し側のプロシージャが赤色、呼び出される側のプロシージャが青色としています。
呼び出されル側で引数が利用できるように準備します。(ByVal 仮引数名 As データ型)
呼び出し側で水色のプロシージャを利用します。(下の図では赤色枠内の青色部分)
ByValで引数を設定すると赤色の箱の変数とは別に青色の箱の変数が準備されるようになります。
ここで例えば赤色の箱の変数に「5」という値がセットされていいたとすると、青色の箱の変数が準備されたとき、ここにも「5」がセットされます。
このあと、呼び出された側のプロシージャ内で変数(青色の箱)の値が変えられた場合でも赤色の箱と青色の箱でお互いに干渉することはありません。これがByValを利用したときの動きとなります。
ByRefとは
ByRefで設定した変数は同じ変数を利用するといった動きをします。コピーではなく値の入った場所を共有してプロシージャから利用します。
下の図では呼び出し側のプロシージャが赤色、呼び出される側のプロシージャが緑色としています。
呼び出されル側で引数が利用できるように準備します。(ByRef 仮引数名 As データ型)
呼び出し側で水色のプロシージャを利用します。(下の図では赤色枠内の緑部分)
ByRefで引数を設定すると赤色の箱の変数を共有して利用するようになります。
ここで例えば赤色の箱の変数に「5」という値がセットされていいたとすると、この「5」が入った赤色の箱そのものを緑のプロシージャ内で利用することになります。
このあと、呼び出された側のプロシージャ内で変数の値を変えた場合、赤色の箱の値を変更することになるので「呼び出し側」、「呼び出され側」のどのプロシージャから確認しても赤色の箱の中は変更後の値となります。これがByRefを利用したときの動きとなります。
サンプルプロシージャ1(ByVal:値渡し)
'コピーの値を利用します。itemに入ってきた値を変えても元の値には影響しない
Sub UsingByVal()
Dim item As String
item = "書き換え前"
MsgBox "ByValFuncが動く前のUsingByValでのMsgBoxのitemは「" & item & "」です"
ByValFunc item 'ここでサブルーチンの呼び出し
MsgBox "ByValFuncが動いたあとのUsingByValでのMsgBoxのitemは「" & item & "」です"
End Sub
'------------------------------------------------------------------------------------------------
Sub ByValFunc(ByVal item As String)
item = "書き換え"
MsgBox "ByValFunc内のMsgBoxのitemは「" & item & "」です。"
End Sub
'------------------------------------------------------------------------------------------------
実行結果
サンプルプロシージャ2(ByRef:参照渡し)
'変数そのものの値を利用します
'今回のitemは元の値のある場所を共有して利用する四次元ポケットなので元の値に影響を与えます。
Sub UsingByRef()
Dim item As String
item = "書き換え前"
MsgBox "ByRefFuncが動く前のUsingByRefでのMsgBoxのitemは「" & item & "」です"
ByRefFunc item
MsgBox "ByRefFuncが動いたあとのUsingByRefでのMsgBoxのitemは「" & item & "」です"
End Sub
'------------------------------------------------------------------------------------------------
Sub ByRefFunc(ByRef item As String)
item = "書き換え"
MsgBox "ByRefFunc内のMsgBoxのitemは「" & item & "」です。"
End Sub
'------------------------------------------------------------------------------------------------
実行結果
今回は以上となります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。