如何将变量从一个函数传递到另一个函数?

时间:2017-01-02 07:14:09

标签: excel vba function byref

我试图将变量从一个函数传递给另一个函数。

我的第一个想法是使用ByRef声明,我听说它将在Visual Basic中通过引用传递参数。但是,我不清楚如何使用它。现在我有以下代码。

            Function number(x As Double) As Double

                Dim z As Double
                z = 10.5
                number = x

            End Function

            Function triple(ByRef z As Double) As Double

                z = z * 3
                triple = z

            End Function

让我们说A1=2.5。如果我说B1=number(A1)那么答案是2.5,我预计它是。然后我说B2=triple(B1)然后答案是7.5而不是31.5。我不确定为什么它取A1的值而不是从函数z中获取变量number的值。

这是工作表的屏幕截图

enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:1)

数字函数中的z在函数返回时消失了。三重功能只会传递通过的数字,2.5倍3这就是你所看到的。 tipple函数不知道z。 共享变量的一种方法是在函数之外声明它们。 Dim z在函数外部为double。 但是如果你传递z作为b1的值是2.5那么你将得到相同的7.5只调用三次,不要传递b1的值

Dim z As Double

    Function tripple(x As Double)
        ' Use the value calculated from first function
        tripple = z * 3

    End Function
    Function number(x As Double)

        ' Set the global variable
        ' May be some calculations are done and z is set
        z = 10.5

        'Return x as in original code
        number = x
    End Function

答案 1 :(得分:0)

我不得不承认,我对你要做的事情感到很困惑。我最初的想法是做类似这样的事情,这与@dgorti建议的类似,但如果z从未被声明,则恢复到函数的输入值。

不幸的是,据我所知,VBA不支持可以为空的双打,也不支持全局变量的初始化。这些功能中的任何一个都可能会排除对zDeclared变量的需求:

Option Explicit

Public z As Double
Public zDeclared As Boolean

Function number(x As Double) As Double
    z = 10.5
    zDeclared = True
    number = x
End Function

Function triple(x As Double) As Double

  If zDeclared Then
    triple = z * 3
  Else
    triple = x * 3
  End If

End Function

CAVEAT:这可能无法达到预期效果。例如,如果您致电number然后致电triple,则变量z将被初始化。如果删除调用number的函数,您可能希望triple恢复为输入值 - 但它不会。此时已完成了什么。

并且,作为解释,参数中的默认ByVal与可选ByRef之间的差异是ByVal创建参数值的新实例,而{ {1}}使用现有变量,因此保留对其的任何更改。也许你已经明白了,但我认为值得澄清。

ByRef