ভিবিএর অভিধান কাঠামো আছে? কী <> মান অ্যারে পছন্দ?
ভিবিএর অভিধান কাঠামো আছে? কী <> মান অ্যারে পছন্দ?
উত্তর:
হ্যাঁ.
এমএস স্ক্রিপ্টিং রানটাইম ('মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম') এর জন্য একটি রেফারেন্স সেট করুন। @ রেজিওর মন্তব্য অনুসারে, সরঞ্জাম-> রেফারেন্সগুলিতে যান এবং 'মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম'-এর জন্য বাক্সটি টিক দিন।
নীচের কোডটি ব্যবহার করে একটি অভিধান উদাহরণ তৈরি করুন:
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
এই অবজেক্টটি ইনস্ট্যান্ট করার জন্য দেরীতে বাইন্ডিং পদ্ধতিটি ব্যবহার করতে হবে ।
ভিবিএর সংগ্রহ অবজেক্টটি রয়েছে:
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- এ ধন্যবাদ যুক্ত করা হয়েছে।
Contains
: On Error Resume Next
_ col(key)
_Contains = (Err.Number = 0)
ContainsKey
; যে কেউ কেবল প্রার্থনাটি পড়ছেন তা এটির কোনও নির্দিষ্ট মান রয়েছে কিনা তা যাচাই করার জন্য এটি বিভ্রান্ত করতে পারে।
একটি অতিরিক্ত অভিধান উদাহরণ যা ঘটনার ফ্রিকোয়েন্সি ধারণ করতে দরকারী।
লুপের বাইরে:
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
সিজেআরএর উত্তর বন্ধ করে , আমরা কোনও লেবেল প্রয়োজন (একটি লেবেল ব্যবহার পছন্দ করি না) এর জন্য একটি কন্টেনস ফাংশন তৈরি করতে পারি।
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
যদি কোনও কারণে, আপনি আপনার এক্সেলের অতিরিক্ত বৈশিষ্ট্যগুলি ইনস্টল করতে পারবেন না বা চান না, আপনি কমপক্ষে সাধারণ সমস্যার জন্যও অ্যারেগুলি ব্যবহার করতে পারেন। হোয়াটসআইপিসিটাল হিসাবে আপনি দেশের নাম রেখেছিলেন এবং ফাংশন আপনাকে এর রাজধানী দেয়।
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()
ফাংশনটি একটি দরকারী শর্টকাট হলেও এটি ভিবিএতে অ্যারেগুলি ঘোষণা করার মানক উপায় নয়।
অন্যরা সবাই ইতিমধ্যে অভিধান ক্লাসের স্ক্রিপ্টিং.আরুনটাইম সংস্করণের ব্যবহারের কথা উল্লেখ করেছে। আপনি যদি এই ডিএলএল ব্যবহার করতে অক্ষম হন তবে আপনি এই সংস্করণটিও ব্যবহার করতে পারেন, কেবল আপনার কোডটিতে এটি যুক্ত করুন।
https://github.com/VBA-tools/VBA-Dictionary/blob/master/Dictionary.cls
এটি মাইক্রোসফ্ট সংস্করণের অনুরূপ।