|
▼ドカ さん:
▼ドカ さん:
こんにちは
最初に、追加質問のほうを。
これは、基本的には Debug.Print dic(myName)(n) でもエラーにならず参照できると思いますが
このコードが書かれている時点で、myName の値や n の値が正しいということが前提です。
エラーになった時、黄色く光りますが、マウスを myName や n に当てた時にポップアップされる値は
正しいものでしょうか?
次に、前の説明の中で、Dictionaryには「何でも格納できる」といいました。
たとえばオブジェクトも (Set をかけることで)Dictionaryのデータとして格納できます。
これは、いささか「マニアック」な使い方になりますけど、
Set Dic("AAA") = CreateObject("Scripting.Dictionary")
Set Dic("BBB") = CreateObject("Scripting.Dictionary")
このようにしますと、Dic の中の"AAA" というキーのデータが、"AAA"用の、独立したDictionary。
Dic の中の"BBB" というキーのデータが、"BBB"用の、独立したDictionaryになります。
ということは Dic("AAA") そのものが Dictionary ですから
Dic("AAA")("XYZ") と書きますと、Dic("AAA") というDictionaryの中に登録されている
"XYZ"というキーを持つデータということになります。
また、「配列」も格納することができます。
たとえば
Dic("AAA") = Array("X","Y","Z") と書きますと
"AAA" というキーで登録されているのが1次元配列ということになります。
で、ご質問の dicRow(rowKey) 。
dicRow は キーが 名前とその名前のあった列番号(ブロックの最初の列番号)を組み合わせたもの。
データは、そのキーでの項目の数、つまり、そのブロックに、その名前が何件あったかという数です。
なので、dicRow(rowKey) で得られる内容は、単純な数字ですから、中身の参照ができます。
仮に、dicRowに rowKey に当たるデータがなくとも、エラーにはならず空白値を返してくれます。
(これも、Dictionaryが使いやすい一面です)
一方、dic(myName)(n)。
こちらのほうは、Dic(myName) で得られるデータは myName用の「子Dictionary」です。
Dic("田中") とした場合、"田中"が存在すれば、"田中"用の子Dictionaryのオブジェクトが
1次元配列がかえってきます。
n は dicRow(rowKey) ですから Dic("田中")(4) とすると、"田中"用のDictionaryのキーが4
つまり、F列から始まるブロックのデータということになります。
で、このデータは、どんなものかといいますと、「1次元配列」です。
これがエラーになるとすると、考えられることは以下の場合のみです。
Dic に "田中"が未登録。 この場合、未登録でもエラーにはなりません。
なりませんが、配列でもオブジェクトでもない空白値が返ります。
配列であればその4番目の要素、Dictionaryであれば 4 というキーのデータということになるのですが
空白値(4) ということですので、当然エラーになります。
|
|