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

How do I pass a variable from one function to another function?

我正在尝试将一个变量从一个函数传递到另一个函数。

我的第一个想法是使用 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 的值而不是从函数 number.

中获取变量 z 的值

这是工作表的屏幕截图

提前致谢。

数字函数中的 z 在函数 returns 时消失了。三重函数只是使传递的数字翻倍,即您所看到的 3 的 2.5 倍。 tipple 函数不知道 z。 共享变量的一种方法是在函数外声明它们。 在函数外将 z 调暗为 double。 但是如果你传递 z 作为 b1 的值 2.5 那么你将得到相同的 7.5 只需调用三重,不要传递 b1

的值

将 z 调暗为双倍

    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

我不得不承认,我对您要尝试做的事情完全感到困惑。我最初的想法是做这样的事情,这类似于@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

警告: 这可能无法达到您的预期。例如,如果您调用 number,然后调用 triple,则变量 z 将被初始化。如果您删除调用 number 的函数,您可能希望 triple 恢复为输入值——但它不会。该做的到此为止。

并且,在解释的方式上,参数中的默认 ByVal 与可选 ByRef 之间的区别在于 ByVal 创建参数值的新实例,而 ByRef 使用现有变量,因此保留对它的任何更改。也许你已经明白了,但我认为值得澄清一下。

Sub IncrementByVal(ByVal inp As Integer)
  inp = inp + 1
End Sub

Sub IncrementByRef(ByRef inp As Integer)
  inp = inp + 1
End Sub

Sub Test()
  Dim X As Integer
  X = 1
  IncrementByVal X  ' x is still 1  - the increment was for a locally scoped variable only
  IncrementByRef X  ' x is now 2
End Sub