布団が俺を呼んでいる

丘山大一のぶろぐ

VBAのプロシージャ呼び出しの括弧のまとめ

VBAでプロシージャ呼び出しの際、引数に括弧をつけるのかつけないのか・つけたらどうなるのかが異様に分かりづらかったので真面目に調べました。
というか自分の整理のためにまとめました。
参考にさせて頂いたのは下記ブログです。
先人の知恵はありがたや~


VBAプロシージャの引数の基本

  • 基本は参照渡し
  • 戻り値を使わないプロシージャ呼び出しは括弧不要
  • 戻り値を使うプロシージャ呼び出しは括弧が必要
  • Call を使う時は括弧が必要
  • Call を使った時は参照渡し
  • 個別に括弧をつけると値渡し


実際の呼び出し


下記のhogeとhoge2という二つのFunction プロシージャの呼び出しパターンとその時の引数の渡し方で試します。
実際にコピペして動作させた方が分かりやい(と思います)。

Option Explicit

' 呼び出すFunction

Function hoge(x As Integer) As Integer
  x = x * 2
  hoge = x + 1
End Function

Function hoge2(x As Integer, y As Integer) As Integer
  x = x * 2
  y = y * 2
  hoge2 = x + y
End Function

' 以下、呼び出し側

Sub fuga()
  Dim a As Integer
  Dim b As Integer
    
  ' 戻り値を使用しない・括弧をつけないで呼び出す。引数は参照渡し。
  a = 3
  hoge a
  MsgBox a ' message 6
  
  ' 戻り値を使用しない・括弧をつけて呼び出す。個別に括弧をつけているので引数は値渡し。
  a = 3
  hoge (a)
  MsgBox a ' message 3
   
  ' Callで呼び出す・引数は参照渡し。
  a = 3
  Call hoge(a)
  MsgBox a ' message 6
  
  ' Callで呼び出す・個別に括弧をつけているので引数は渡し。
  a = 3
  Call hoge((a))
  MsgBox a ' message 3
    
  ' 戻り値を使用する。引数は参照渡し。
  a = 3
  b = hoge(a)
  MsgBox a ' message 6
  MsgBox b ' message 7
  
  ' 戻り値を使用する。個別に括弧をつけているので引数は渡し。
  a = 3
  b = hoge((a))
  MsgBox a ' message 3
  MsgBox b ' message 7
        
  ' Callで呼び出す・引数内部で計算してしまっているので……これは値渡し?
  a = 3
  b = 2
  Call hoge(a + b)
  MsgBox a ' message 3
  MsgBox b ' message 2
  
  ' 戻り値を使用しない・括弧をつけないで呼び出す。引数は参照渡し。
  a = 3
  b = 2
  hoge2 a, b
  MsgBox a ' message 6
  MsgBox b ' message 4
  
  
  ' 戻り値を使用しない・第一引数は括弧をつけているので値渡し。・第二引数は括弧をつけていないので参照渡し。
  a = 3
  b = 2
  hoge2 (a), b
  MsgBox a ' message 3
  MsgBox b ' message 4
    
  ' Callで呼び出す・引数は参照渡し。
  a = 3
  b = 2
  Call hoge2(a, b)
  MsgBox a ' message 6
  MsgBox b ' message 4
  
  a = 3
  b = 2
  ' Callで呼び出す・第一引数は括弧をつけているので値渡し。・第二引数は括弧をつけていないので参照渡し。
  MsgBox a ' message 3
  MsgBox b ' message 4
  
  ' hoge2(a, b) ' 戻り値を使わないのに括弧をつけているので構文はエラー
  ' Call hoge2 a, b  ' Callで呼んでいるのに括弧がないので構文エラー
  
End Sub


ハマりそうなところ


個別に括弧をつけた場合、値渡しになるわけですが、これプロシージャの定義がByRef でも上書きされるんですよね。
これは参考元の方に書かれていますが、単に先に評価しているからなのでしょうね。

という理屈は分かった気になりましたが、やっぱり分かりづらいです。


2020/2/19 :間違いがあったので修正

コメントを書く