|    | 
     ▼ドカ さん: 
 
▼ドカ さん: 
 
こんにちは 
 
最初に、追加質問のほうを。 
これは、基本的には 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) ということですので、当然エラーになります。 
 | 
     
    
   |