Scripting.Dictionaryの要素をCollection化するFunction

Scripting.Dictionaryの要素をCollection化するFunction

Scripting.DictionaryクラスのItemsメソッド

何気なくScripting.Dictionaryクラスのインスタンスをぶち込んだ変数の後に「.」(ドット)を打ち込んだら、

f:id:akashi_keirin:20180309211937j:plain

Intellisenseでこんなのが出た。

よく見たら、「Items」ってのがメソッドのアイコン付きで出ている。

「Items」なんて、まるでCollectionみたいな名前なのに、メソッドってどういうことだろう?

調べてみた

おなじみMSDNで調べてみると、

Items メソッド

Dictionary オブジェクト内のすべての項目を格納した配列を返します。

だとさ。

どうも、Scripting.Dictionaryの要素のうち、「Key」ではなく「Item」の方を配列にして返すメソッドらしい。

……ということは、

akashi-keirin.hatenablog.com

このときの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でイミディエイトに表示する。

実行結果

f:id:akashi_keirin:20180309211945j:plain

意図どおりの結果となった。

おわりに

前回記事の内容と今回記事の内容を踏まえて、無駄にIteratorクラスを作ってみたりしています。近日公開予定!

@akashi_keirin on Twitter