2012-05-14 24 views
6

Tôi luôn sử dụng ByRef thành công, cho đến bây giờ. Tôi cần một hàm để sửa đổi một số Double từ một đối tượng lớp. Để minh họa, hãy xem xét chương trình sau đây.ByRef không hoạt động trong VBA với loại giá trị từ một lớp

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

Đối với tôi ngạc nhiên, ví dụ trên sẽ ra

5 
10 

Bất kỳ ai?

Trả lời

6

Dưới mui xe aClassInstance.publicVariable được đóng gói như một get tài sản ẩn/để cặp, vì vậy đi ByRef được đi qua các địa chỉ của ẩn get tính giá trị trở lại, không phải là biến cơ bản khai báo trong lớp.

Bạn có thể kiểm tra điều này bằng cách kiểm tra địa chỉ của 2 dạng d trong lớp; họ sẽ khác nhau

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

Hum, cảm ơn! Bây giờ, làm thế nào tôi có thể sửa chữa điều đó? Thật không may, tôi vẫn cần chức năng đó để sửa đổi giá trị. –

+0

Bạn có thể 'temp = cd: ChangeVar temp: cd = temp' hoặc hiển thị phương thức' .changeD (incrementor) 'hoặc' Sub ChangeVar (cls As Class1): cls.d = cls.d + 1' –

+0

Vì vậy, tôi giả sử nó không thể chỉ sử dụng ByRef và PublicVariable của tôi? –

1

Chỉ cần chạy vào vấn đề này bản thân mình, cách giải quyết sạch của nó được biến nó thành một chức năng

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 
Các vấn đề liên quan