ভিবিএর কি অভিধান স্ট্রাকচার আছে?


উত্তর:


341

হ্যাঁ.

এমএস স্ক্রিপ্টিং রানটাইম ('মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম') এর জন্য একটি রেফারেন্স সেট করুন। @ রেজিওর মন্তব্য অনুসারে, সরঞ্জাম-> রেফারেন্সগুলিতে যান এবং 'মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম'-এর জন্য বাক্সটি টিক দিন।

রেফারেন্স উইন্ডো

নীচের কোডটি ব্যবহার করে একটি অভিধান উদাহরণ তৈরি করুন:

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 

17
এই ডেটা স্ট্রাকচার ধরণটি স্ক্রিপ্টিং রানটাইম দ্বারা সরবরাহ করা হয়েছে, ভিবিএ দ্বারা নয়। মূলত, ভিবিএ ব্যবহারিকভাবে কোনও সিএমএম ইন্টারফেসের মাধ্যমে অ্যাক্সেসযোগ্য কোনও ডেটা স্ট্রাকচার ধরণের ব্যবহার করতে পারে।
ডেভিড-ডব্লিউ-ফেন্টন

163
কেবল সম্পূর্ণতার স্বার্থে: এটি কাজ করার জন্য আপনাকে "মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম" উল্লেখ করতে হবে (সরঞ্জাম-> রেফারেন্সগুলিতে যান) এবং এর বাক্সটি চেক করুন।
রেজো

7
উহ, ভিবিএ সংগ্রহগুলি কীড। তবে আমাদের আলাদা সংজ্ঞা থাকতে পারে keyed
ডেভিড-ডাব্লু-ফেন্টন

8
আমি এক্সেল 2010 ব্যবহার করছি ... তবে "মাইক্রোসফ্ট স্ক্রিপ্টিং রানটাইম" সরঞ্জামগুলি - রেফারেন্স ছাড়াই - রেফ .. কেবল ক্রিয়েটবজেক্ট করা কাজ করে না। সুতরাং, @ মাস্টারজো আমার মনে হয় আপনার উপরের মন্তব্যটি ভুল। যতক্ষণ না আমি কিছু মিস করছি না .. সুতরাং, ছেলেরা সরঞ্জাম -> উল্লেখ প্রয়োজন।
ihightower

4
এফওয়াইআই হিসাবে, আপনি Dim dict As New Scripting.Dictionaryরেফারেন্স ছাড়া এটি ব্যবহার করতে পারবেন না । রেফারেন্স ছাড়াই আপনাকে CreateObjectএই অবজেক্টটি ইনস্ট্যান্ট করার জন্য দেরীতে বাইন্ডিং পদ্ধতিটি ব্যবহার করতে হবে ।
ডেভিড জেমেন্স

179

ভিবিএর সংগ্রহ অবজেক্টটি রয়েছে:

    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- এ ধন্যবাদ যুক্ত করা হয়েছে।


5
বিল্ট ইন কালেকশন অবজেক্টটি দেখানোর জন্য ভাল কাজটি অভিধান হিসাবে ব্যবহৃত হতে পারে, যেহেতু অ্যাড পদ্ধতির একটি বিকল্প "কী" যুক্তি রয়েছে।
সাইমন তেউসি

8
সংগ্রহ অবজেক্টটি সম্পর্কে খারাপ জিনিসটি হ'ল আপনি কীটি ইতিমধ্যে সংগ্রহে রেখেছেন কিনা তা পরীক্ষা করতে পারবেন না। এটি কেবল একটি ত্রুটি ছুঁড়ে ফেলবে। এটি বড় জিনিস, সংগ্রহগুলি সম্পর্কে আমি পছন্দ করি না। (আমি জানি যে
কার্যকার্য

5
নোট করুন যে ভিবিএ অভিধান আইএসে স্ট্রিং কীগুলির (যেমন সি। আইটেম ("কী 2")) হ্যাশ হয়েছে তবে পূর্ণসংখ্যার সূচক (যেমন সি। আইটেম (20)) দ্বারা অনুসন্ধান করা নয় - এটি পরবর্তী / পরবর্তী জন্য লিনিয়ার শৈলী অনুসন্ধান এবং এড়ানো উচিত। কেবল স্ট্রিং কী লুপআপের জন্য বা প্রতিটি পুনরাবৃত্তির জন্য সংগ্রহগুলি ব্যবহার করা সেরা।
বেন ম্যাকআইন্টির

4
আমি একটি সংক্ষিপ্ত খুঁজে পেয়েছি Contains: On Error Resume Next_ col(key)_Contains = (Err.Number = 0)
TWiStErRob

5
সম্ভবত ফাংশনটির নামকরণ করা উচিত ContainsKey; যে কেউ কেবল প্রার্থনাটি পড়ছেন তা এটির কোনও নির্দিষ্ট মান রয়েছে কিনা তা যাচাই করার জন্য এটি বিভ্রান্ত করতে পারে।
jpmc26

44

ভিবিএর অভিধানের অভ্যন্তরীণ প্রয়োগ নেই, তবে ভিবিএ থেকে আপনি এমএস স্ক্রিপ্টিং রানটাইম লাইব্রেরি থেকে অভিধান অবজেক্টটি ব্যবহার করতে পারেন।

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

29

একটি অতিরিক্ত অভিধান উদাহরণ যা ঘটনার ফ্রিকোয়েন্সি ধারণ করতে দরকারী।

লুপের বাইরে:

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

1
অতিরিক্ত টিউটোরিয়াল লিঙ্কটি হ'ল: kamath.com
জন এম

এটি খুব ভাল উত্তর ছিল এবং আমি এটি ব্যবহার করেছিলাম। তবে, আমি দেখতে পেয়েছি যে আপনি যেমন করেন ঠিক তেমন লুপটিতে আমি ডিক.আইটেমগুলি (আই) বা ডিক্ট.কি (আই) উল্লেখ করতে পারি না। লুপে প্রবেশের আগে আমাকে সেগুলির (আইটেমের তালিকা এবং কীগুলির তালিকা) আলাদা ওয়ারে সংরক্ষণ করতে হবে এবং তারপরে আমার প্রয়োজনীয় মানগুলিতে পৌঁছানোর জন্য সেগুলি ব্যবহার করতে হবে। পছন্দ - allItems = CompanyList.Items allKeys = CompanyList.Keys allItems (i) যদি না হয় তবে আমি ত্রুটিটি পেয়ে যাব: কীগুলি (i) অ্যাক্সেস করার চেষ্টা করার সময় সম্পত্তি সম্পত্তি প্রক্রিয়াটি সংজ্ঞায়িত না করা এবং সম্পত্তি পেতে পদ্ধতি কোনও জিনিস ফেরত দেয় না "বা আইটেম (i) লুপে।
রাদেবাস

10

সিজেআরএর উত্তর বন্ধ করে , আমরা কোনও লেবেল প্রয়োজন (একটি লেবেল ব্যবহার পছন্দ করি না) এর জন্য একটি কন্টেনস ফাংশন তৈরি করতে পারি।

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

6

স্ক্রিপ্টিং রানটাইম অভিধানে একটি বাগ রয়েছে যা উন্নত পর্যায়ে আপনার নকশাটিকে নষ্ট করতে পারে।

অভিধানের মানটি যদি একটি অ্যারে হয় তবে আপনি অভিধানের কোনও রেফারেন্সের মাধ্যমে অ্যারেতে থাকা উপাদানগুলির মানগুলি আপডেট করতে পারবেন না।


6

হ্যাঁ. জন্য ভিবি 6 , VBA (সীমা অতিক্রম করা), এবং VB.NET


2
আপনি প্রশ্নগুলি আরও পড়তে পারেন: আমি ভিবিএ সম্পর্কে জিজ্ঞাসা করেছি: ভিজুয়াল বেসিক অ্যাপ্লিকেশনটির জন্য, ভিবিয়ের জন্য নয়, ভিবি.নেটের জন্য নয়, অন্য কোনও ভাষার জন্য নয়।

1
fessGUID: আবার, আপনার উত্তর আরও পড়তে হবে! এই উত্তরটি ভিবিএর জন্যও ব্যবহার করা যেতে পারে (বিশেষত, প্রথম লিঙ্কটি)।
কনরাড রুডলফ

5
আমি ভর্তি হলাম. প্রশ্নটি খুব দ্রুত পড়েছি। তবে তার জানা দরকার যা আমি তাকে বলেছিলাম।
ম্যাথু ফ্ল্যাশেন

5
@ ওরঙ্গ, ভিবিএ ভিসি.এনইটি-র সাবসেট হয়ে ওঠার কোনও প্রমাণ নেই, অফিসে ব্যাককম্যাট বিধি - লিখিত প্রতিটি এক্সেল ম্যাক্রোর রূপান্তর করার চেষ্টা করে দেখুন।
রিচার্ড গ্যাডসডেন

2
ভিবিএ আসলে ভিবি 6 এর একটি সুপারসেট। এটি ভিবি 6 এর মতো একই কোর ডিএলএল ব্যবহার করে, তবে তারপরে অফিসে নির্দিষ্ট অ্যাপ্লিকেশনগুলির জন্য সমস্ত ধরণের কার্যকারিতা যুক্ত করে।
ডেভিড-ডাব্লু-ফেন্টন

4

যদি কোনও কারণে, আপনি আপনার এক্সেলের অতিরিক্ত বৈশিষ্ট্যগুলি ইনস্টল করতে পারবেন না বা চান না, আপনি কমপক্ষে সাধারণ সমস্যার জন্যও অ্যারেগুলি ব্যবহার করতে পারেন। হোয়াটসআইপিসিটাল হিসাবে আপনি দেশের নাম রেখেছিলেন এবং ফাংশন আপনাকে এর রাজধানী দেয়।

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

1
এই উত্তরের ধারণাটি দুর্দান্ত, তবে নমুনা কোডটি লিখিতভাবে চলবে না। প্রতিটি পরিবর্তনশীল নিজস্ব প্রয়োজন Dimকীওয়ার্ডটি Countryএবং Capitalপ্রয়োজন ভেরিয়েন্ট হিসেবে ব্যবহার করার কারণে ঘোষিত করা Array(), iঘোষণা করা কর্তব্য (এবং যদি হতে হবে Option Explicitসেট), এবং লুপ কাউন্টার আবদ্ধ ত্রুটির একটি বর্জন করা যাচ্ছে - এতে নিরাপদ মান UBound(Country)জন্য ব্যবহার করুন To। এছাড়াও সম্ভবত এটি লক্ষণীয় যে Array()ফাংশনটি একটি দরকারী শর্টকাট হলেও এটি ভিবিএতে অ্যারেগুলি ঘোষণা করার মানক উপায় নয়।
jcb

3

অন্যরা সবাই ইতিমধ্যে অভিধান ক্লাসের স্ক্রিপ্টিং.আরুনটাইম সংস্করণের ব্যবহারের কথা উল্লেখ করেছে। আপনি যদি এই ডিএলএল ব্যবহার করতে অক্ষম হন তবে আপনি এই সংস্করণটিও ব্যবহার করতে পারেন, কেবল আপনার কোডটিতে এটি যুক্ত করুন।

https://github.com/VBA-tools/VBA-Dictionary/blob/master/Dictionary.cls

এটি মাইক্রোসফ্ট সংস্করণের অনুরূপ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.