【VBA講座】裏仕様!引数の値渡しを強制する

サブプロシージャ等の引数には
 ・渡し
 ・参照渡し
の2種類があります!

引数の宣言で
 ・ByValとすると値渡し
 ・ByRefとすると参照渡し
になります!
Valは「Value」の略で「」を示しています。
Refは「Reference」の略で「参照」を示しています。

※どちらも記述していない場合は「参照渡し」になります。

「ByVal」としているため「値渡し」
「ByVal」としているため「値渡し」
「ByRef」としているため「参照渡し」
「ByRef」としているため「参照渡し」
何も記述していないため「参照渡し」
何も記述していないため「参照渡し」

ですが
 ・ByRef(参照渡し)としていても
 ・呼び出し時に「カッコ」をつけると「渡し」になる
という裏仕様があります!
※VBAの公式サイトには上記の記載がありません(私には見つけられません)
※ですが実際にVBAコードを実行すると分かります。

呼び出し時に「カッコ」をつけると「値渡し」になる
呼び出し時に「カッコ」をつけると「値渡し」になる
PR

VBA

ここでは例として
 ・引数を「ByRef(参照渡し)」としたプロシージャ「proc」を定義
 ・プロシージャ「main」から引数にカッコを付けてプロシージャ「proc」を呼び出し
 ・プロシージャ「proc」にて書き換えられたはずの変数「name」の値を確認
します。
書き換えられたはずの変数が、書き換えられていないことを確認します。

'変数の宣言を必須
Option Explicit

Sub main()
    
    Dim name As String
    
    'nameに「佐藤」を設定
    name = "佐藤"
    
    '引数を渡してサププロシージャを実行 ※引数にカッコを付ける
    proc (name)
    
    'ByRef(参照渡)しのため「ゴンザレス」が表示されるはずだが、
    '裏仕様により「佐藤」が表示される。
    '値渡しになっている(値渡しが強制されている)。
    MsgBox name
    
End Sub


Sub proc(ByRef name As String)
    
    '引数としてもらったnameに「ゴンザレス」を設定
    '参照渡しだから呼び出し元のnameも「ゴンザレス」が設定されるはず
    name = "ゴンザレス"
    
End Sub
PR

実行結果

「ゴンザレス」ではなく「佐藤」が表示されました。
※変数「name」が書き換えられていないことを確認できました。
※引数の値渡しが強制されていることを確認できました。

実行結果
実行結果
PR

参考

この「値渡しを強制する」という仕様は、VBAの公式サイトには記載がありませんがVisual Basicの公式サイトには記載があります。
※VBAとVisual Basicは、共にMicrosoftが作成/提供しているプログラミング言語です。
※VBAとVisual Basicは、言語仕様が非常に似通っています。
※非常に似通っているため、Visual Basicに存在する「値渡しを強制する」という仕様がVBAに存在しても、不思議ではありません。

詳細は公式サイトご確認ください。

●Visual Basicの値渡しを強制について

タイトルとURLをコピーしました