2017-01-02 216 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 
相關問題