2012-05-14 3 views
6

से मूल्य प्रकार के साथ वीबीए में काम नहीं कर रहा है, अब तक मैं हमेशा ByRef सफलतापूर्वक उपयोग करता हूं। मुझे कक्षा-ऑब्जेक्ट से Double को संशोधित करने के लिए फ़ंक्शन की आवश्यकता है। उदाहरण के लिए, निम्नलिखित कार्यक्रम पर विचार करें।ByRef कक्षा

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 के तहत एक छिपा संपत्ति प्राप्त/जाने जोड़ी के रूप में समझाया गया है, इसलिए ByRef छिपा get गुणों का पता गुजर रहा है गुजर वापसी मूल्य, नहीं अंतर्निहित चर वर्ग में घोषित कर दिया।

आप कक्षा के भीतर d के 2 रूपों के पते की जांच करके इसका परीक्षण कर सकते हैं; वे अलग अलग

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

हम में तब्दील हो जाता है, धन्यवाद! अब, मैं इसे कैसे ठीक कर सकता हूं? दुर्भाग्यवश, मुझे मूल्य को संशोधित करने के लिए अभी भी उस फ़ंक्शन की आवश्यकता है। –

+0

आप 'temp = cd: ChangeVar temp: cd = temp' या '.changeD (incrementor)' विधि या' उप चेंजवायर (कक्षा 1 के रूप में cls) का खुलासा कर सकते हैं: 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