关于VBA代码返回多个值

时间:2017-11-15 19:31:23

标签: vba excel-vba excel

我在这里需要帮助来了解变量Ret如何以及从何处具有值“2”。

我无法理解此代码,有人可以帮助我。

Function Test(ByVal Input1 As Integer, ByVal Input2 As Integer, _
    ByRef Output1 As Integer, ByRef Output2 As Integer) As Integer

      Output1 = Input1 + Input2
      Output2 = Input1 - Input2
      Test = Output1 + Output2

End Function

Sub Test2()

    Dim Ret As Integer, Input1 As Integer, Input2 As Integer, _
    Output1 As Integer, Output2 As Integer
    Input1 = 1
    Input2 = 2
    Ret = Test(Input1, Input2, Output1, Output2)
    Sheet1.Range("A1") = Ret     ' 2
    Sheet1.Range("A2") = Output1 ' 3
    Sheet1.Range("A3") = Output2 '-1

End Sub

2 个答案:

答案 0 :(得分:1)

返回值

VBA中的返回值是通过将函数名称设置为值来完成的。例如:

Function myFunction()
    myFunction = 123
End Function

当我调用myFunction时,我可以将函数的返回值赋给变量,例如像:

returnValue = myFunction

returnValue现在的值为123

在您的示例中,函数Test返回Output1 + Output2

的结果
Output1 + Output2 = 3 + (-1) = 2

因此,函数Test返回值2

ByRef / ByVal参数

这里发生的另一件事是两种不同类型的参数。

传递参数 ByVal (按值)会创建变量的副本并将该副本传递给函数。因此,如果我调整函数内部的变量,它在调用函数中的值不会改变。例如:

Function MyFunction(ByVal num)
    num = 2
End Function

然后我像这样调用函数:

count = 1
Call MyFunction(count)
MsgBox count

MsgBox将显示数字1.变量count被复制到另一个变量(MyFunction内的num),当num被赋值为2时,count保持不变。

传递参数 ByRef 是相反的:参数不会被复制,而是直接(作为参考〜作为“链接”)传递给函数。

让我们再看一下上面的MyFunction,但想象一下将参数更改为ByRef而不是ByVal。在这种情况下,MsgBox count将显示值2.当我们将count ByRef传递给MyFunction时,num将成为与count相同的变量的别名,并且{{1} }}被赋值为2,num是同一个变量,因此它现在也具有值2.

答案 1 :(得分:0)

Ret获取Test函数

的结果值
Ret = Test(Input1, Input2, Output1, Output2)