2017-01-02 163 views
0

我想将一个函数的变量传递给另一个函数。如何将一个函数的变量传递给另一个函数?

我首先想到的是使用我听说将在Visual Basic引用传递参数的为ByRef声明。但是,我不清楚如何使用它。现在我有以下代码。

  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的价值。

这里的工作表

enter image description here

提前感谢的屏幕截图。

+0

你是否在Excel UI中将它们用作用户定义函数或VBA代码? – user3598756

+0

@ user3598756这是用于VBA代码 – Soto

+0

那么'A1','B1'和'B2'是什么?显示您的VBA代码片段,使用这些功能 – user3598756

回答

1

数函数内的Z是时间的函数返回了。三重功能只是让数字通过,2.5倍3,这是你所看到的。 tipple功能不知道z。 共享变量的一种方法是在函数之外声明它们。 Dim z在函数外部为双精度值。 不过,如果你通过时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 
+0

如果您处于需要调用从第一个函数这样你可以在第二个函数中使用它?那么如何使用'z'? – Soto

+0

你可以尝试将变量定义为全局变量。尝试使用公共z作为函数外部的双精度值。该变量应该可用于脚本中的所有功能。 –

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 

警告:这可能不是你所期望的。例如,如果你调用number,然后调用triple,变量z将被初始化。如果删除调用number的函数,则可能会希望triple恢复为输入值 - 但不会。在这一点上完成了什么。

而且,在说明的方式,在一个参数与可选ByRef默认ByVal之间的不同之处在于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 
相关问题