Dictionaryと戯れはじめ。
わたしが読んできたいろいろなものでは,Collectionオブジェクトの上位互換とか聞くDictionary。
というか目的が違う全く別物じゃないの?という個人的な意見を持ちます。
とても面白そうなもの,というのは間違いないんですが,なかなか私の頭の中ではまだイメージが出来上がっていない。
その理由が自分なりにわかりだしました。
最近ローカルウィンドウに頼り切ってるせいなのかな。Dictionaryのローカルウィンドウの表示が私のイメージを混乱させているようです。
いつもは強力な仲間なのに!!
こんな簡単な表で,
コードも簡単。Cellsもあえて,シート無視して書いています。
この表示おかしいと思うのは私だけかな。
ローカルウィンドウでアイテムの中身を見ているようで,表示されているのはキーなんですよね。。
同じようなものをCollectionで書くと,
こっちはちゃんと値が表示されています。こう出るのならわたしのイメージにしっくりくる。
キーを確認することは私の知識ではできませんでしたが,イミディエイトウィンドウで書いているように,連想配列としてもちゃんと機能している。
なぜ似た者同士なのにこうも違う!
この違いは私のような日曜大工プログラマーにとって大いなる障壁になりますよ!
書き方も微妙にずれてますしね,挑戦的としか思えない。
dictionaryのほうは addで書くなら オブジェクトをdicとすると,
dic.add キー,値
dic(キー)=値 とも書けます。
collectionのほうは, オブジェクトをcolとすると,
col.add 値,キー キーはオプション
似すぎてるくせに逆。
しかも,ローカルウィンドウの表示が違う。ヒドイデスヨネ。
そうそう,dictionaryはキーの重複を許さないからどうのこうの,という表現をわたしよく見てきたんですが,
collectionもキーがかぶったら同じように怒ります。
その点の優位性ってdictionaryあるんだろうか??
collectionのほうが,キーが無くても登録させてくれる許容力があって,それでいいじゃないと思ってしまいました。
まだ,学び始めたところなので,間違ったことをいつも以上に書いているかもしれませんが,いろいろ試してみるとやっぱり面白いなぁ。
いちおう使ったコード貼っておきます。
Sub test() Dim dic As Scripting.Dictionary Set dic = New Scripting.Dictionary Dim i As Long: i = 1 Do dic(Cells(i, 3).Value) = Cells(i, 2).Value 'dic.Add Cells(i, 3).Value, Cells(i, 2).Value i = i + 1 Loop Until Cells(i, 1) = "" Stop End Sub Sub test2() Dim col As Collection: Set col = New Collection Dim i As Long: i = 1 Do col.Add Cells(i, 2).Value, Cells(i, 3).Value i = i + 1 Loop Until Cells(i, 1) = "" Stop End Sub
追記 大事なことを忘れていました。多くの場合,Cellsは.Valueまで書かなくてもセルの値を返してくれる動きをしますが,dictionaryとかcollectionで.valueを省略すると,
Cellsオブジェクトとして放り込まれてわけがわからなくなるので注意!というかわたしがワケカワラナクナリマシタ。オタガイキヲツケマショウ。
学び中なので,dictionaryは参照設定して書いています。
参照設定については,thomさんのページを見てください。私は覚えてません(゚▽゚*)
参照設定とCreateObjectの対応リスト - You.Activate