Excel VBA数组按引用传递异常?未用返回值时数组未更新
这不是Bug,是VBA参数传递的语法规则导致的
你遇到的现象完全符合VBA的设计逻辑,核心原因是调用函数时的括号改变了参数传递方式:
关键规则:括号强制按值传递
在VBA中:
- 当你调用一个过程(Sub或Function)时,如果给参数单独加上括号(比如
TestFunction (xyzArray)),这会触发表达式分组行为,强制将参数按值传递(ByVal),而非默认的按引用传递(ByRef)。此时函数接收的是原数组的临时副本,所有修改都只作用于副本,原数组自然不会更新。 - 而调用Sub时你没有加括号(
TestSub xyzArray),参数按默认的ByRef传递,函数内对数组的修改会直接作用于原数组,所以原数组被成功更新。
正确的函数调用方式
如果希望调用函数时按引用传递参数(即使不接收返回值),可以用两种写法:
- 使用
Call语句,此时参数需要加括号:Call TestFunction(xyzArray) - 直接调用函数,去掉参数外的括号:
TestFunction xyzArray
关于返回值接收的情况
当你用newXYZ = TestFunction(xyzArray)调用时,这里的括号是函数调用的标准语法(而非强制按值的括号),参数默认按ByRef传递。但你的测试中数组未被修改,是因为函数参数XYZ未声明类型(默认是Variant),VBA在处理Variant类型的数组参数时,会额外创建副本用于返回值赋值,但核心规则依然不变:单独给参数加括号会强制按值传递。
对应你的测试结果
从输出可以看到:
- D2:F2:初始数组值
1,2,3 - D3:F3:调用
TestFunction (xyzArray)(带括号),原数组未变化,仍为1,2,3 - D4:F4:调用
newXYZ = TestFunction(xyzArray),因参数传递的Variant处理细节,原数组未被修改 - D5:F5:调用
TestSub xyzArray(无括号),原数组被修改为2,3,4 - D6:F6:再次调用
TestFunction (xyzArray)(带括号),原数组保持2,3,4不变 - D7:F7:调用
TestFunctionNoReturn (xyzArray)(带括号),原数组仍为2,3,4
内容的提问来源于stack exchange,提问作者Anders Nilsson
相关产品推荐
相关产品推荐

