2012-05-14 23 views
6

我總是成功使用ByRef,直到現在。我需要一個函數來修改類對象的Double。爲了說明,請考慮以下程序。ByRef不能在VBA中使用值類型從類

Class1.cls: 
Public d As Double
Sub Test() 
    Dim c As Class1, d As Double 
    Set c = New Class1 

    c.d = 5 
    d = 5 

    ChangeVar c.d 
    ChangeVar d 

    Debug.Print c.d 
    Debug.Print d 
End Sub 

Sub ChangeVar(ByRef d As Double) 
    d = 10 
End Sub

對於我驚訝的是,上面的例子將輸出

5 
10 

任何人?

回答

6

引擎蓋下aClassInstance.publicVariable被封裝爲隱藏屬性get/let對,所以傳遞ByRef是傳遞隱藏的get屬性返回值的地址,而不是在類中聲明的基礎變量。

您可以通過檢查該類中的d這兩種形式的地址來進行測試;他們將不同

(class_init) 
debug.? " d address=" & VarPtr(d) 
debug.? ".d address=" & VarPtr(me.d) 
+0

嗯,謝謝!現在,我該如何解決這個問題?不幸的是,我仍然需要這個函數來修改這個值。 –

+0

你可以'temp = cd:ChangeVar temp:cd = temp'或者暴露一個'.changeD(incrementor)'方法或'Sub ChangeVar(cls As Class1):cls.d = cls.d + 1' –

+0

所以,我假設僅使用ByRef和我的PublicVariable是不可能的? –

1

就遇到了這個問題我自己,它的清潔解決方法是把它變成一個功能

Sub Test()  
    Dim c As Class1, d As Double  
    Set c = New Class1  
    c.d = 5  
    d = 5  
    c.d = ChangeVar(c.d)  
    d = ChangeVar(d)  
    Debug.Print c.d  
    Debug.Print d 
End Sub 

Public function ChangeVar(d As Double)  
    ChangeVar = 10 
End Function