AccessのVBAで引数の渡し方を省略した時は参照渡しになるのでちょっと気を付けよう


本当か~?本当にそうか~?

確認コードのテンプレはこちら。

Option Compare Database
Option Explicit

Private Sub do_Click()

    Dim str As String
    str = "シャミ子"

    '関数に渡す前
    Debug.Print str

    Call momo(str)

    '関数に渡した後
    Debug.Print str

End Sub


Private Function momo(arg As String)
    arg = arg + "が悪いんだよ"
End Function

結果。

蛇足

別の言語からVBAに移ると、あれ?デフォルトってどっちだっけ?とか、ああ…VBAはデフォルトは参照渡しだったのね…、なんていろいろ間違えちゃうことあります。

『ByVal or ByRef を必ず付ける』というコード規約にすると良いかもですね。

VBE側で『ByVal』と自動補完してくれて、必要がある時だけ『ByRef』に変更、が一番ベストかなって思います。
できるだけ疎結合になるように。

参考サイトさん

バージョン

Windows10 Pro バージョン1909 OSビルド18363.1171
Access for Microsoft 365 MSO(16.0.13328.20262)32ビット