如何将变量从一个函数传递到另一个函数?
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
我正在尝试将一个变量从一个函数传递到另一个函数。
我的第一个想法是使用 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