VBA中如何从Sub/Function返回多个变量并传递给其他Sub过程
VBA过程返回多个值的实现方案
原代码的核心问题有两点:
Sub过程本身不支持直接返回值,需要返回值的场景优先用Function- 单个
Function默认只能返回一个值,要返回多个结果需要通过数组合并结果、或者传引用参数的方式实现
方案1:Function返回数组(推荐)
只需要调用一次计算过程,把多个结果打包为数组返回,调用方从数组里按顺序取需要的值即可,代码简洁易维护:
Sub Main() Dim calcResult As Variant ' 单次调用完成计算,存储全部返回结果 calcResult = Test(250) ' 按写入数组的顺序取值:第一个元素为Param_A,第二个为Param_B Sheets("SheetA").Range("A1") = calcResult(0) Sheets("SheetA").Range("B1") = calcResult(1) End Sub Function Test(speed As Long) As Variant Dim Param_A As Long, Param_B As Long Param_A = 1 * speed Param_B = 2 * speed ' 将两个结果打包为数组返回 Test = Array(Param_A, Param_B) End Function
如果担心数组下标受Option Base设置影响,可以显式声明固定下标的数组,兼容性更强:
Function Test(speed As Long) As Variant Dim res(1 To 2) As Long res(1) = 1 * speed ' 对应Param_A res(2) = 2 * speed ' 对应Param_B Test = res End Function
对应Main过程里取值改成calcResult(1)和calcResult(2)即可。
方案2:ByRef引用传参(Sub过程实现)
如果要保留Sub的写法,可以通过传址参数把计算结果直接同步到外部变量,不需要通过返回值传递:
Sub Main() Dim Param_A As Long, Param_B As Long ' 调用时传入接收结果的变量 Call Test(250, Param_A, Param_B) Sheets("SheetA").Range("A1") = Param_A Sheets("SheetA").Range("B1") = Param_B End Sub ' 注意参数前的ByRef关键字,表示按地址传递,过程内修改参数会同步修改外部变量 Sub Test(speed As Long, ByRef out_ParamA As Long, ByRef out_ParamB As Long) out_ParamA = 1 * speed out_ParamB = 2 * speed End Sub
注意事项
不要为了取不同的返回值重复调用两次Test过程:
- 计算逻辑复杂时会产生不必要的性能损耗
- 如果Test过程内包含随机数、读取外部数据、修改单元格等有副作用的逻辑,两次调用的返回结果可能不一致
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

