带参数Sub过程调用差异问题:为何不同调用方式结果不同?
VBA Sub过程调用方式对传参的影响
这段VBA代码中,ChangeString Sub过程的调用方式不同,会导致最终消息框的输出结果完全不同:
- 使用
ChangeString (str)调用时,消息框返回**"First String"** - 使用
ChangeString str或Call ChangeString(str)调用时,返回**"Second String"**
原本以为这几种都是调用Sub并传递参数的等效方式,预期每次都能得到**"Second String"**,实际在Excel 2016和2021中测试后发现并非如此。
测试代码如下:
Sub TryByRef() Dim str As String str = "First String" ChangeString (str) 'ChangeString str 'Call ChangeString(str) MsgBox str End Sub Sub ChangeString(ByRef s As String) s = "Second String" End Sub
原因解析
VBA里的括号在Sub调用时作用特殊:
- 当直接用
ChangeString (str)(不带Call关键字的括号调用),括号会强制对str进行值传递(相当于临时创建一个副本传入Sub),Sub内部修改的只是这个副本,原变量str不会被改变。 - 而
ChangeString str(无括号)或者Call ChangeString(str)(带Call关键字加括号)的调用方式,会严格按照Sub定义的ByRef(引用传递)规则传参,Sub内部修改的是原变量本身,所以原字符串会被替换成"Second String"。
内容的提问来源于stack exchange,提问作者Gabriele
相关产品推荐
相关产品推荐

