「excel vba collection keyで検索」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
VBA(Visual Basic for Applications)の、Collectionオブジェクトに格納されている要素・データを、
Keyを使って取得するにはどのようなコードを書けばいいのか、探している方による検索です。
CollectionのKeyを指定してItemを取得するサンプルマクロ
簡単なサンプルマクロをご紹介しておきます。
Dim coll As Collection
Dim fnd_key As String
Set coll = New Collection
coll.Add Item:="松", Key:="イ"
coll.Add Item:="竹", Key:="ロ"
coll.Add Item:="梅", Key:="ハ"
On Error GoTo ERR_HNDL
fnd_key = InputBox("イ・ロ・ハ のいずれかを入力してください。")
MsgBox coll.Item(fnd_key)
Exit Sub
ERR_HNDL:
Err.Clear
MsgBox "みつかりませんでした。"
上記のマクロを実行すると、
「イ・ロ・ハ のいずれかを入力してください。」
というインプットボックスが表示され、入力されたKeyによって、松・竹・梅 いずれかの文字列がメッセージボックスに表示されます。
サンプルマクロの解説
変数宣言の直後の、
coll.Add Item:="松", Key:="イ"
coll.Add Item:="竹", Key:="ロ"
coll.Add Item:="梅", Key:="ハ"
が、CollectionオブジェクトにAddメソッドを使ってデータを格納している部分です。
KeyからItemを取得するのが、
fnd_key = InputBox("イ・ロ・ハのいずれかを入力してください。")
MsgBox coll.Item(fnd_key)
の部分です。
CollectionオブジェクトのItemメソッドに、
Keyの文字列を指定すれば、該当するデータを取得することができます。
Dictionaryオブジェクトを使うほうがよくありませんか
「excel vba collection keyで検索」
という検索キーワードでしたので、Collectionを使った簡単なマクロをご紹介しましたが、CollectionオブジェクトよりもDictionaryオブジェクトを使うほうがいいのではないか、という気がしてなりません。
複数のデータを一時的に入れておくというだけなら、まあCollectionでもいいと思うのですが、
「excel vba collection keyで検索」
という検索キーワードからは、簡易テーブル的な使い方をしようとしていることが容易に想像できます。
このような場合、できることが限られいてデバッグ作業も行い辛いCollectionより、Dictionaryのほうがいいように感じます。
オブジェクトブラウザーをちょっと眺めるだけでも、Collectionオブジェクトのほうが、
Dictionaryオブジェクトよりも
プロパティ・メソッドが少ないですから、できることが少ないのは一目瞭然です。
ちなみに、先のマクロと同じことをDictionaryオブジェクトで行う場合、以下のようなプロシージャです。
Dim dic As Object ' Scripting.Dictionary
Dim fnd_key As String
Set dic = CreateObject("Scripting.Dictionary")
dic.Add Key:="イ", Item:="松"
dic.Add Key:="ロ", Item:="竹"
dic.Add Key:="ハ", Item:="梅"
On Error GoTo ERR_HNDL
fnd_key = InputBox("イ・ロ・ハ のいずれかを入力してください。")
MsgBox dic.Item(fnd_key)
Exit Sub
ERR_HNDL:
Err.Clear
MsgBox "みつかりませんでした。"
15年ほど前ならば、Dictionaryを使えない環境のことをまだまだ考えざるを得ませんでしたから、Collectionを使うという選択肢も十分ありましたが、2016年現在、もうそんなことは考える必要はないでしょう。簡易テーブル的にデータを格納するならば、CollectionよりDictionaryだろうと私は思っています。
I strongly recommend that you use a Dictionary object in place of the Collection object. The Dictionary object is fast in comparison to the Collection, and it has more functionality.
1998年10月に出版された『Vb & Vba in a Nutshell』の73ページにも、以上のような記述があります。
Home » Dictionaryオブジェクトの使い方 » CollectionのKeyを指定して要素を取得する