Home » エクセルマクロ・Excel VBAの使い方 » ByRef・参照渡しとはどう使うのか

「byval byref インストラクターのネタ帳」
という検索キーワードに気づきました。

他のプロシージャを呼ぶ際の引数指定方法に、ByVal(値渡し)とByRef(参照渡し)があります。

この違いについて、私に解説しろ、ということなのでしょう。

[スポンサードリンク]

「ByValを指定すると値が渡され、ByRefを指定すると参照が渡されます。ByVal・ByRefの指定がなければByRefとみなされてしまいますから、基本的にはByValをしっかり指定しましょう。」
といった解説は、既に読んでらっしゃると思います。

ByRef(参照渡し)を、どう使うのかを知らないと、このような教科書丸写し的な説明では納得感がなくて当然です。

ByRef・参照渡しを使ったサンプルマクロ

実務でありそうな例を考えてみましょう。

何らかのコード番号があって、そのコード番号を処理して複数の値を返して欲しいといった処理は、VBAでありがちです。

例えば、顧客コードを渡して顧客名と住所と電話番号を返して欲しい、あるいは、郵便番号を渡して都道県名とそれ以降の住所を返して欲しいといった処理です。

その具体的な実装方法はいくつも考えられますが、そのひとつとして、参照渡しを使ったプロシージャの利用が考えられます。

Public Sub main()
 Dim code_org As String: code_org = "abcd012345"
 Dim code_1 As String, code_2 As String

 Call splitCode(code_org, code_1, code_2)

 MsgBox code_1
 MsgBox code_2
End Sub


Private Sub splitCode(ByVal code As String, ByRef val1 As String, ByRef val2 As String)
 val1 = Mid(code, 1, 4)
 val2 = Mid(code, 5, 6)
End Sub

ここでは単純な例で、コード番号を渡すと、分割して前半4桁と後半6桁を返すだけの処理にしました。

上記のSubプロシージャmainを実行すると、
  Dim code_org As String: code_org = "abcd012345"
の部分で指定されている10桁のコード番号「abcd012345」の、前4桁「abcd」と、後ろの6桁「012345」がメッセージボックスに、順番に表示されます。

サンプルマクロの解説

ポイントはSubプロシージャmainの、
  Call splitCode(code_org, code_1, code_2)
の部分で呼んでいる、SubプロシージャsplitCodeの、
  ByVal code As String, ByRef val1 As String, ByRef val2 As String
第2引数と第3引数です。

第1引数codeには元のコード番号を指定します。これはVBAで他のプロシージャを引数付きで呼んだ経験のある方なら、何の問題もない引数です。

第2引数と第3引数が「ByRef val1 As String, ByRef val2 As String」と参照渡しになっていますから、呼び出した元のプロシージャmainに結果を返すことができます。

そのためmain側の
  MsgBox code_1
  MsgBox code_2
で「abcd」「012345」が表示されたのです。

もちろん、
第2引数と第3引数を「ByVal val1 As String, ByVal val2 As String」と値渡しに変更して実行した場合は、mainに結果は返されませんから、
  MsgBox code_1
  MsgBox code_2
で、空っぽのメッセージボックスが2回表示されます。

これが、ByRef(参照渡し)とByVal(値渡し)の違いです。

Functionプロシージャでは基本的に1つのデータしか返せませんが、Subプロシージャであっても引数をByRefにすることで、複数の値を呼び出し元に返すことができるわけです。

もっともシンプルな、2つの値を返してもらう例を見ましたが、3つ以上の値を返して欲しい場合も同様です。

指定されたコードを使って何らかのデータベースからレコードを取得して、複数の値を元のプロシージャに返すという場合も考え方は同じです。

ByRef・参照渡しはいくつも考えられる実装方法のひとつ

ちなみに、上記のサンプルをだけを見て、プロシージャから複数の値を返して欲しいときには、必ずByRefを使うものなどとは、絶対に思い込まないでください。

上記のような単純な例でもさまざまな実装方法があり得ます。

コードの前半4桁と後半6桁を、配列で返すFunctionプロシージャを作るという方法もあるでしょう。

そもそも2つの値を返してもらわなくても、コードの前半4桁だけを返すFunctionプロシージャと、後半6桁だけを返すFunctionプロシージャの2つを作るという方法があるでしょう。

2つのFunctionプロシージャを作るのではなく、1つのFunctionプロシージャに、元のコード番号と、前半または後半を指定する、2つの引数を渡す形にするという方法だってあります。

他にもコード番号に関する処理がたくさんあるのならば、コード番号を処理するクラスを作っておいて、そのメソッドやプロパティとして実装するという方法もあるでしょう。

あくまでも、他のプロシージャから値を返してもらうひとつの方法として、参照渡しも使えると理解してください。

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » ByRef・参照渡しとはどう使うのか

「エクセルマクロ・Excel VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.
.