2012-02-22 4 views
13

नया वीबीए। किसी अन्य फ़ंक्शन में शब्दकोश ऑब्जेक्ट को कैसे पास करें।पास वीबीए शब्दकोश

Sub aaa(dict As Object) 
Set dict = CreateObject("Scripting.Dictionary") 
... 
process dict 
End Sub 

Sub process(dict As Scripting.Dictionary) 
    MsgBox dict.Count 
End Sub 

एक संकलन त्रुटि देता है: उपयोगकर्ता परिभाषित प्रकार


भी परिभाषित नहीं,

Set dict = CreateObject("Scripting.Dictionary") 

काम करता है, लेकिन

Dim dict As New Scripting.Dictionary 

देता है, "उपयोगकर्ता परिभाषित प्रकार परिभाषित नहीं किया गया "

मैं Excel 2010

उत्तर

12

जब आप CreateObject का उपयोग करते हैं तो आप ऑब्जेक्ट को रन-टाइम (यानी देर से बाध्यकारी) पर बाध्य कर रहे हैं। जब आप As Scripting.Dictionary का उपयोग करते हैं तो ऑब्जेक्ट संकलन-समय (यानी, प्रारंभिक बाध्यकारी) पर बाध्य होता है।

यदि आप प्रारंभिक बाध्यकारी करना चाहते हैं तो आपको सही पुस्तकालय का संदर्भ सेट करने की आवश्यकता होगी। ऐसा करने के लिए, टूल्स -> संदर्भ ... और "माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम"

+0

जहां इस "माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम" एक्सेल 2016 में है? – compski

5

का उपयोग त्रुटि माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम जोड़ने (उपकरण में -> संदर्भ) से बचने के लिए।
सरलीकृत उदाहरण:

Sub test_dict() 
    Dim dict As New Scripting.Dictionary 
    Call process(dict) 
End Sub 

Sub process_dict(dict As Scripting.Dictionary) 
    MsgBox dict.Count 
End Sub 
3

आप प्रकार की पहचान करने में सक्षम होना अपने मैक्रो के लिए माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम लायब्रेरी के लिए एक संदर्भ जोड़ने की जरूरत है। गोटो टूल्स-> संदर्भ और माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम के लिए जांचें।

3

मैं देर से ही बंधन का उपयोग करने के लिए इस सवाल का जवाब समीक्षा की जाती थी, और एक वस्तु पैरामीटर का उपयोग:

Sub aaa(dict As Object) 
Set dict = CreateObject("Scripting.Dictionary") 
... 
process dict 
End Sub 

Sub process(dict As Object) 
    MsgBox dict.Count 
End Sub 
+1

स्टैक ओवरफ्लो में आपका स्वागत है। यह स्पष्ट नहीं है कि नया जवाब क्या लाता है। आप कहते हैं कि आप केवल देर बाध्यकारी का उपयोग करेंगे, लेकिन क्यों नहीं कहें। – manuell

+1

कोड नई स्थितियों में अनावश्यक संदर्भों के बिना अधिक पुन: प्रयोज्य है जो पोर्टेबिलिटी में हस्तक्षेप कर सकता है। कुछ पुस्तकालय समान संस्करण नहीं होते हैं और देर से बाध्यकारी किसी अन्य सिस्टम पर हमेशा नहीं पाए जाते हैं, यदि आपको इंटेलिजेंस की आवश्यकता नहीं है, तो रिलीज के बीच विकल्प खुले और कम संभावित समस्याएं रखती हैं। – mrbillbenson

+2

यदि लाइब्रेरी अन्य सिस्टम पर नहीं है, तो देर से बाध्यकारी किसी भी तरह से तोड़ने जा रहा है। 'स्क्रिप्टिंग' लाइब्रेरी बहुत सर्वव्यापी है, और एक * लंबे * समय में संस्करण नहीं बदला है। 'ऑब्जेक्ट' के रूप में घोषित करने से ऑब्जेक्ट को देर से कॉल करने वाली मजबूरियां मिलेंगी, जो धीमी हो जाएगी। आपको इंटेलिजेंस नहीं मिलेगा, और आपको संकलन-समय त्रुटि जांच नहीं मिलेगी। कभी-कभी देर से बाध्य पुस्तकालयों के लिए वैध उपयोग होते हैं, लेकिन 'स्क्रिप्टिंग। रनटाइम' निश्चित रूप से उनमें से एक नहीं है। – ThunderFrame

0

के बाद आप "उपकरण> References-> Microsoft स्क्रिप्टिंग रनटाइम" जोड़कर कोशिश इस

Private Sub CommandButton1_Click() 

    Dim myLocalDictionary As New Dictionary 
    myLocalDictionary.Add "a", "aaa" 
    myLocalDictionary.Add "b", "bbb" 
    myLocalDictionary.Add "c", "ccc" 

    Call testPassDictionary(myLocalDictionary) 

End Sub 

Sub testPassDictionary(myDictionary As Dictionary) 
    MsgBox myDictionary.Count 
End Sub