ES000001_VBAエキスパート(ExcelVBAスタンダード)合格講座/第一回:プロシージャの呼び出し

VBAエキスパート(ExcelVBAスタンダード)合格講座/第一回:プロシージャの呼び出し ExcelVBA Standard

このページの内容について

このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第一回記事です。公式テキスト第1章「プロシージャ」の内容について解説します。自分でも手を動かしながら読み進めてください。

プロシージャの呼び出し

ベーシックまでの内容

プロシージャはマクロの最小実行単位です。プロシージャには値を返すことができないSubプロシージャと値を返すことができるFunctionプロシージャがあります。これだけ見ると値を返すことができるFunctionプロシージャのみを使えば良いように見えますが、呼び出し方やユーザーからの見え方に違いがあり、開発においてはそれぞれ使い分けて使用します。プロシージャはプロシージャを呼び出すことができます。

サンプルコード(クリックでコピー)

Private Sub Caller()

Call Msgbox(Adder(10, 11))

End Sub
Private Function Adder(ByVal x As Long, ByVal y As Long) As Long

Adder = x + y

End Function

実行結果

上記サンプルコード上段の「Caller」を実行すると、Functionプロシージャである「Adder」を呼び出します。「Adder」は2つの整数(Long)を受け取り、足し算した結果を返します。「Caller」は返された整数値「21」をそのままMsgbox関数に渡してメッセージを表示します。

値渡しと参照渡し

プロシージャは値を受け取ることができます。値の受け取り方には2種類あります。

値渡し

引数に「ByVal」を設定すると、値渡しになります。値渡しされた引数はプロシージャ内で書き換えをしても呼び出し元に影響しません。

参照渡し

引数に「ByRef」を設定すると、参照渡しになります。参照渡しされた引数はプロシージャ内で書き換えた内容が、呼び出し元に反映します。

「ByVal」「ByRef」を指定しない場合、「ByRef」が指定されたものとみなされます。

サンプルコード(クリックでコピー)

Private Sub RefCaller()

Dim a As Long, b As Long
a = 10
b = 11
Call ReferenceTest(a, b)
Debug.Print a
Debug.Print b

End Sub
Private Sub ReferenceTest(ByRef x As Long, ByVal y As Long)

x = x + 10
y = y + 10

End Function

実行結果

上記サンプルコード上段の「RefCaller」を実行すると「ReferenceTest」を呼び出します。「ReferenceTest」は第一引数を参照渡しで受け取り、第二引数を値渡しで受け取ります。そして2つの整数にそれぞれ「10」を足して処理を終了します。「RefCaller」は「ReferenceTest」に渡した2つの変数をそれぞれイミディエイトウィンドウに出力します。第一引数として渡した変数「a」には10が加算されており、第二引数として渡した変数「b」には呼び出し先の変更が反映されていないことを確認できます。

値渡しと参照渡しの違い・・長くなるので読み飛ばしOK。

PCは5大要素から構成されています。
 ①制御装置
 ②演算装置
 ③記憶装置
 ④入力装置
 ⑤出力装置
このうち、①と②の機能を持つのがCPU、③の機能を持つのがメモリです。マクロなどプログラムの実行時に変数などに格納されたデータはメモリ上に存在しています。そしてメモリは番地で管理されています。例えば、1番地~16番地までを使って変数xの値を格納している・・といった具合です。ここで値渡しは、この格納されたデータのコピーを作成して引数として渡します。参照渡しはこの番地を引数として渡します。その違いのために、値渡しでは、呼び出し先での変数の書き換えは呼び出し元に影響せず、参照渡しでは、呼び出し先での変数の書き換えが呼び出し元に影響するのです。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment