Scripting.Dictionaryの要素をCollection化するFunction
Scripting.Dictionaryの要素をCollection化するFunction
Scripting.DictionaryクラスのItemsメソッド
何気なくScripting.Dictionaryクラスのインスタンスをぶち込んだ変数の後に「.」(ドット)を打ち込んだら、
Intellisenseでこんなのが出た。
よく見たら、「Items」ってのがメソッドのアイコン付きで出ている。
「Items」なんて、まるでCollectionみたいな名前なのに、メソッドってどういうことだろう?
調べてみた
おなじみMSDNで調べてみると、
Items メソッド
Dictionary オブジェクト内のすべての項目を格納した配列を返します。
だとさ。
どうも、Scripting.Dictionaryの要素のうち、「Key」ではなく「Item」の方を配列にして返すメソッドらしい。
……ということは、
このときのFunctionを使ったら、Scripting.Dictionaryの要素もCollection化できてしまうことになる!
やってみた
VBEの「ツール」→「参照設定」へと進み、「Microsoft Scripting Runtime」にチェックを入れて、次のコードで実験してみる。
リスト1 標準モジュール
Public Sub testDicToCllection() Dim dic As New Scripting.Dictionary '……(1)' With dic .Add Key:="a1", _ Item:="ち~んw" .Add Key:="a2", _ Item:="プヒー!" .Add Key:="a3", _ Item:="( ´,_ゝ`)プッ" .Add Key:="a4", _ Item:="( ´_ゝ`)フーン" End With Dim cl As New Collection Set cl = convertArrayToCollection(dic.Items) '……(2)' Dim i As Integer For i = 1 To cl.Count Debug.Print cl.Item(i) Next End Sub
まず(1)からの11行(実質7行)
Dim dic As New Scripting.Dictionary '……(1)' With dic .Add Key:="a1", _ Item:="ち~んw" .Add Key:="a2", _ Item:="プヒー!" .Add Key:="a3", _ Item:="( ´,_ゝ`)プッ" .Add Key:="a4", _ Item:="( ´_ゝ`)フーン" End With
で要素数4のScripting.Dictionaryのインスタンスを生成。
Itemsメソッドが配列を返すということなので、
dic.Items
を(2)の
Set cl = convertArrayToCollection(dic.Items)
で前回記事のリスト1のFunctionに渡して、返り値をCollection型の変数clにぶち込む。
これで、変数clにはScripting.Dictionaryのインスタンスdocの要素(「Item」の方)が格納されているはずなので、後はForループで1つづつ取り出してDebug.Printでイミディエイトに表示する。
実行結果
意図どおりの結果となった。
おわりに
前回記事の内容と今回記事の内容を踏まえて、無駄にIteratorクラスを作ってみたりしています。近日公開予定!