01-VBA

Excel VBA の イベント編(Part.1)3つのプロシージャ /引数のByVal(値渡し)とByRef(参照渡し)| 現役エンジニア&プログラミングスクール講師

目標

Subプロシージャ・Functionプロシージャ・イベントプロシージャの違いを確認する
Excel VBA の「ByVal(値渡し)とByRef(参照渡し)」を理解して利用できる

3つのプロシージャの概要

3つのプロシージャの概要

Subプロシージャ

Subプロシージャは各種モジュールの中で実行されるプログラムです。ワークシートに設置したフォームコントロールボタンなどに「マクロの登録」をする場合はSubプロシージャである必要があります。

フォームコントロールボタンなどにマクロの登録をしてプロシージャを呼び出す場合はSubプロシージャとします。Functionプロシージャで作成したプロシージャは登録の画面には出力されません。

Functionプロシージャ

Functionプロシージャは他のプロシージャに呼び出されて実行されるプログラムです。Subプロシージャもサブルーチンとして呼び出して実行できますが、Functionプロシージャの特徴は戻り値(処理が動いた後に生成された値を返す機能)を利用できることです。FunctionプロシージャはVBAプログラムとして動かす以外にワークシート関数としても利用ができます。

SubプロシージャとFunctionプロシージャの違いをまとめると次のようになります。

SubプロシージャFunctionプロシージャ
マクロの登録×
他プロシージャからの呼び出し
引数の利用
戻り値の利用×
ワークシート関数として利用×

引数については下の「引数付きサブルーチンの概要と利用方法」を参考にしてください。

印刷機能番外|Excel VBA (Part.3)【サブルーチン】編 | 現役エンジニア&プログラミングスクール講師ExcelVBAのサブルーチンについての記事です。...

イベントプロシージャ

イベントプロシージャはシートの選択やマウスクリックなどをきっかけにして動くプロシージャのことです。

「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
'------------------------------------------------------------------------------------------------

実行結果

呼び出し側のitemは「書き換え前」のまま変化はありません。

サンプルプロシージャ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
'------------------------------------------------------------------------------------------------

実行結果

itemは共有されているので、どのプロシージャからも「書き換え」として確認できます。

今回は以上となります。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】| 現役エンジニア&プログラミングスクール講師「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
01-VBA

ExcelVBAの「Range & Valueプロパティ」| 現役エンジニア&プログラミングスクール講師

2022年9月9日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

演算子|Excel VBA (Part.6)【その他の演算子】Like演算子 | 現役エンジニア&プログラミングスクール講師

2022年10月31日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

VBScriptを利用したVBAプロシージャの呼び出し(Part.1)| 現役エンジニア&プログラミングスクール講師

2023年2月14日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

制御構文|Excel VBA (Part.6)【For Next】ネスト編(前編)| 現役エンジニア&プログラミングスクール講師

2022年11月25日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の「オブジェクト活用」(Part.1)【ワークシートと行列の活用編】| 現役エンジニア&プログラミングスクール講師

2022年12月14日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

演算子|Excel VBA (Part.1)【算術演算子・代入演算子】| 現役エンジニア&プログラミングスクール講師

2022年10月24日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site