インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Dictionaryと戯れはじめ。

わたしが読んできたいろいろなものでは,Collectionオブジェクトの上位互換とか聞くDictionary。

というか目的が違う全く別物じゃないの?という個人的な意見を持ちます。

とても面白そうなもの,というのは間違いないんですが,なかなか私の頭の中ではまだイメージが出来上がっていない。

その理由が自分なりにわかりだしました。

最近ローカルウィンドウに頼り切ってるせいなのかな。Dictionaryのローカルウィンドウの表示が私のイメージを混乱させているようです。

いつもは強力な仲間なのに!!

f:id:chemiphys:20170214231007p:plain
こんな簡単な表で,
コードも簡単。Cellsもあえて,シート無視して書いています。
f:id:chemiphys:20170214231115p:plain
この表示おかしいと思うのは私だけかな。

ローカルウィンドウでアイテムの中身を見ているようで,表示されているのはキーなんですよね。。

同じようなものをCollectionで書くと,
f:id:chemiphys:20170214232355p:plain

こっちはちゃんと値が表示されています。こう出るのならわたしのイメージにしっくりくる。

キーを確認することは私の知識ではできませんでしたが,イミディエイトウィンドウで書いているように,連想配列としてもちゃんと機能している。

なぜ似た者同士なのにこうも違う!

この違いは私のような日曜大工プログラマーにとって大いなる障壁になりますよ!

書き方も微妙にずれてますしね,挑戦的としか思えない。

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