VBA如何从函数传递字符串数组并在外部函数内修改重定义
报错根因
你的代码存在2个核心问题:
- 自定义函数
testfunc没有设置返回值:你在主过程中写了test = testfunc(test),但函数内部没有给函数名testfunc赋值,函数默认返回空值,执行完赋值语句后原来的test数组会被空值覆盖,后续访问test(3)自然会触发类型不匹配或下标越界报错。 - 不必要的返回赋值:VBA默认按引用(ByRef)传递参数,你直接把数组传入函数后,函数内部对数组的修改会直接作用到原数组上,不需要额外用返回值赋值。
修复方案
方案1:直接利用按引用传参修改数组(不需要返回值)
这种写法最简单,适合不需要在函数里调整数组长度的场景:
Sub test() Dim test() As Variant ReDim Preserve test(1 To 4) test(1) = "one" test(2) = "two" ' 直接调用过程即可,不需要赋值 testfunc test Debug.Print test(3) ' 输出three End Sub ' 直接用Sub过程即可 Sub testfunc(test() As Variant) test(3) = "three" End Sub
方案2:函数返回数组写法(适合要在函数内用ReDim Preserve调整数组长度的场景)
如果你后续需要在函数里用Preserve重定义数组,推荐用这种显式返回的写法,避免引用传参下重定义数组可能出现的异常:
Sub test() Dim test() As Variant ReDim Preserve test(1 To 4) test(1) = "one" test(2) = "two" test = testfunc(test) Debug.Print test(3) ' 输出three ' 后续可正常用Preserve重定义 ReDim Preserve test(1 To 5) test(5) = "five" End Sub Function testfunc(test() As Variant) As Variant() test(3) = "three" ' 显式把修改后的数组赋值给函数名作为返回值 testfunc = test End Function
注意函数的返回值类型要声明为Variant(),和传入的数组类型匹配,避免类型转换错误。
内容的提问来源于stack exchange,提问作者protter
相关产品推荐
相关产品推荐

