क्या VBA में शब्दकोश संरचना है? कुंजी की तरह <> मान सरणी?
क्या VBA में शब्दकोश संरचना है? कुंजी की तरह <> मान सरणी?
जवाबों:
हाँ।
MS स्क्रिप्टिंग रनटाइम ('Microsoft स्क्रिप्टिंग रनटाइम') का संदर्भ सेट करें। @ रेगो की टिप्पणी के अनुसार, टूल्स-> संदर्भ पर जाएं और 'Microsoft स्क्रिप्टिंग रनटाइम' के लिए बॉक्स को टिक करें।
नीचे दिए गए कोड का उपयोग करके एक शब्दकोश उदाहरण बनाएं:
Set dict = CreateObject("Scripting.Dictionary")
या
Dim dict As New Scripting.Dictionary
उपयोग का उदाहरण:
If Not dict.Exists(key) Then
dict.Add key, value
End If
Nothing
जब आप इसे उपयोग करना समाप्त कर लें तो शब्दकोश को सेट करना न भूलें ।
Set dict = Nothing
keyed
।
Dim dict As New Scripting.Dictionary
संदर्भ के बिना उपयोग नहीं कर सकते । संदर्भ के बिना, आपको CreateObject
इस ऑब्जेक्ट को इंस्टेंट करने की देर से बाध्यकारी विधि का उपयोग करना होगा ।
VBA संग्रह वस्तु है:
Dim c As Collection
Set c = New Collection
c.Add "Data1", "Key1"
c.Add "Data2", "Key2"
c.Add "Data3", "Key3"
'Insert data via key into cell A1
Range("A1").Value = c.Item("Key2")
Collection
वस्तु प्रदर्शन कुंजी आधारित एक हैश का उपयोग कर तो यह जल्दी हो जाता है लुकअप।
आप Contains()
किसी विशेष संग्रह में कोई कुंजी है या नहीं यह जांचने के लिए एक फ़ंक्शन का उपयोग कर सकते हैं :
Public Function Contains(col As Collection, key As Variant) As Boolean
On Error Resume Next
col(key) ' Just try it. If it fails, Err.Number will be nonzero.
Contains = (Err.Number = 0)
Err.Clear
End Function
24 जून 2015 को संपादित करें : Contains()
@TWiStErRob के लिए शुक्रिया।
25 सितंबर 2015 को संपादित करें : Err.Clear()
@scipilot में धन्यवाद जोड़ा गया ।
ContainsKey
; केवल मंगलाचरण पढ़ने वाला कोई व्यक्ति इसे जाँचने के लिए भ्रमित कर सकता है कि इसमें एक विशेष मूल्य है।
VBA में किसी शब्दकोश का आंतरिक कार्यान्वयन नहीं है, लेकिन VBA से आप अभी भी MS Scripting Runtime Library से शब्दकोश ऑब्जेक्ट का उपयोग कर सकते हैं।
Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "aaa"
d.Add "b", "bbb"
d.Add "c", "ccc"
If d.Exists("c") Then
MsgBox d("c")
End If
एक अतिरिक्त शब्दकोश उदाहरण, जो घटना की आवृत्ति से युक्त होता है।
पाश के बाहर:
Dim dict As New Scripting.dictionary
Dim MyVar as String
एक लूप के भीतर:
'dictionary
If dict.Exists(MyVar) Then
dict.Item(MyVar) = dict.Item(MyVar) + 1 'increment
Else
dict.Item(MyVar) = 1 'set as 1st occurence
End If
आवृत्ति पर जांच करने के लिए:
Dim i As Integer
For i = 0 To dict.Count - 1 ' lower index 0 (instead of 1)
Debug.Print dict.Items(i) & " " & dict.Keys(i)
Next i
Cjrh के उत्तर को बंद करते हुए , हम बिना लेबल की आवश्यकता वाले समसामयिक फ़ंक्शन का निर्माण कर सकते हैं (मुझे लेबल का उपयोग करना पसंद नहीं है)।
Public Function Contains(Col As Collection, Key As String) As Boolean
Contains = True
On Error Resume Next
err.Clear
Col (Key)
If err.Number <> 0 Then
Contains = False
err.Clear
End If
On Error GoTo 0
End Function
मेरी एक परियोजना के लिए, मैंने एक Collection
तरह से अधिक व्यवहार करने के लिए सहायक कार्यों का एक सेट लिखा Dictionary
। यह अभी भी पुनरावर्ती संग्रह की अनुमति देता है। आप देखेंगे कि कुंजी हमेशा पहले आती है क्योंकि यह अनिवार्य था और मेरे कार्यान्वयन में अधिक समझ में आता था। मैंने भी केवल String
कुंजियों का उपयोग किया । आप चाहें तो इसे वापस बदल सकते हैं।
मैंने इसका नाम बदलकर सेट कर दिया क्योंकि यह पुराने मूल्यों को अधिलेखित कर देगा।
Private Sub cSet(ByRef Col As Collection, Key As String, Item As Variant)
If (cHas(Col, Key)) Then Col.Remove Key
Col.Add Array(Key, Item), Key
End Sub
err
सामान के बाद से आप उपयोग कर वस्तुओं से होकर गुजरेगा वस्तुओं के लिए है set
बिना और चर। मुझे लगता है कि आप जांच कर सकते हैं कि क्या यह एक वस्तु है, लेकिन मुझे समय के लिए दबाया गया था।
Private Function cGet(ByRef Col As Collection, Key As String) As Variant
If Not cHas(Col, Key) Then Exit Function
On Error Resume Next
err.Clear
Set cGet = Col(Key)(1)
If err.Number = 13 Then
err.Clear
cGet = Col(Key)(1)
End If
On Error GoTo 0
If err.Number <> 0 Then Call err.raise(err.Number, err.Source, err.Description, err.HelpFile, err.HelpContext)
End Function
इस पोस्ट का कारण ...
Public Function cHas(Col As Collection, Key As String) As Boolean
cHas = True
On Error Resume Next
err.Clear
Col (Key)
If err.Number <> 0 Then
cHas = False
err.Clear
End If
On Error GoTo 0
End Function
अगर यह मौजूद नहीं है तो इसे फेंके नहीं। बस यह सुनिश्चित करता है कि इसे हटा दिया गया है।
Private Sub cRemove(ByRef Col As Collection, Key As String)
If cHas(Col, Key) Then Col.Remove Key
End Sub
कुंजियों की एक सरणी प्राप्त करें।
Private Function cKeys(ByRef Col As Collection) As String()
Dim Initialized As Boolean
Dim Keys() As String
For Each Item In Col
If Not Initialized Then
ReDim Preserve Keys(0)
Keys(UBound(Keys)) = Item(0)
Initialized = True
Else
ReDim Preserve Keys(UBound(Keys) + 1)
Keys(UBound(Keys)) = Item(0)
End If
Next Item
cKeys = Keys
End Function
यदि किसी कारण से, आप अपने Excel में अतिरिक्त सुविधाएँ स्थापित नहीं कर सकते हैं या नहीं करना चाहते हैं, तो आप कम से कम साधारण समस्याओं के लिए सरणियों का भी उपयोग कर सकते हैं। WhatIsCapital के रूप में आप देश का नाम रखते हैं और फ़ंक्शन आपको अपनी पूंजी देता है।
Sub arrays()
Dim WhatIsCapital As String, Country As Array, Capital As Array, Answer As String
WhatIsCapital = "Sweden"
Country = Array("UK", "Sweden", "Germany", "France")
Capital = Array("London", "Stockholm", "Berlin", "Paris")
For i = 0 To 10
If WhatIsCapital = Country(i) Then Answer = Capital(i)
Next i
Debug.Print Answer
End Sub
Dim
कीवर्ड, Country
और Capital
जरूरत के रूप में प्रकार के उपयोग के कारण घोषित करने Array()
, i
घोषित किया जाना चाहिए (और अगर होना चाहिए Option Explicit
सेट है), और पाश काउंटर बाध्य त्रुटि के बाहर निकालने के लिए जा रहा है - करने के लिए सुरक्षित मूल्य के UBound(Country)
लिए उपयोग करें To
। यह भी ध्यान देने योग्य है कि जबकि Array()
फ़ंक्शन एक उपयोगी शॉर्टकट है, यह VBA में सरणियों की घोषणा करने का मानक तरीका नहीं है।
अन्य सभी ने पहले ही डिक्शनरी क्लास के स्क्रिप्टिंग.रंटाइम संस्करण के उपयोग का उल्लेख किया है। यदि आप इस DLL का उपयोग करने में असमर्थ हैं, तो आप इस संस्करण का उपयोग भी कर सकते हैं, बस इसे अपने कोड में जोड़ सकते हैं।
https://github.com/VBA-tools/VBA-Dictionary/blob/master/Dictionary.cls
यह Microsoft के संस्करण के समान है।