VBA入門② No.3 引数を渡してプロシージャを実行する「ByVal,ByRef」

  • 他のサブプロシージャに引数を渡して呼び出す際、値渡し(ByVal)と参照渡し(ByRef)の二つの方法があるよ
  • 値渡しと参照渡しの違いは、引数をプロシージャに渡した際、渡した引数にも影響が出るかでないかの違いなんだけど…
  • 説明が難しいので、とりあえずサンプルを見てください><

文法

Option Explicit

'呼び出し元のプロシージャ
Sub myMain()

Call myAlert("HOGEHOGE")   'myAlertプロシージャに引数を渡して実行

End Sub

'呼び出される側のプロシージャ
Sub myAlert(ByVal myHello As String)

MsgBox myHello

End Sub

Callは省略してもOK

  • Callを省略する場合は、引数を渡す際のカッコ()も省略する必要があります
Option Explicit

'呼び出し元のプロシージャ
Sub myMain()

myAlert "HOGEHOGE" 'myAlertプロシージャに引数を渡して実行

End Sub

'呼び出される側のプロシージャ
Sub myAlert(ByVal myHello As String)

MsgBox myHello

End Sub

ByValで値渡し

  • 以下のサンプルはmyAlertに引数を渡して実行し、その後渡した引数を表示させるプログラムです
  • ByValを使った場合は、呼び出し元のプロシージャの引数myValueに変化はありません
Option Explicit

'呼び出し元のプロシージャ
Sub myMain()

Dim myValue As String
myValue = "Hello"

myAlert myValue 'myAlertプロシージャに引数を渡して実行

MsgBox myValue  '文字列(Hello)が表示される

End Sub

'呼び出される側のプロシージャ
Sub myAlert(ByVal myHello As String)

myHello = myHello & " world!!" '渡された引数に文字列(World!!)を追加

MsgBox myHello  '文字列(Hello World!!)が表示される

End Sub

ByRefで参照渡し

  • 以下のサンプルも上記と同じプログラムですが、値を渡す際、ByRefを利用しています
  • ByRefを使った場合は、呼び出し元のプロシージャーの引数myValueに、受け取る側のプロシージャの引数を受け取る変数の変化が、参照されます(日本語になってる?><)
Option Explicit

'呼び出し元のプロシージャ
Sub myMain()

Dim myValue As String
myValue = "Hello"

myAlert myValue 'myAlertプロシージャに引数を渡して実行

MsgBox myValue  '文字列(Hello World!!)が表示される

End Sub

'呼び出される側のプロシージャ
Sub myAlert(ByRef myHello As String)

myHello = myHello & " world!!" '渡された引数に文字列(World!!)を追加

MsgBox myHello  '文字列(Hello World!!)が表示される

End Sub