You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:35:20