- ベストアンサー
[VBA] 連想配列について
- VBAで連想配列の使い方について困っています。
- データ量が多いため、VLOOKUPの代わりに連想配列を使いたいです。
- しかし、コードの一部がうまく動作せず困っています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
連想配列では、キーと値は1対1です。そのうえで、アイデア次第でやりようは幾らでも考えられると思います。 たとえばアナタのマクロに「比較的」近い方法: sub macro1() dim oDic as object dim a as variant dim i as long a = worksheets("Sheet2").range("A2:C3").value set odic = createobject("Scripting.Dictionary") for i = 1 to ubound(a) odic(a(i, 1) & "_2") = a(i, 2) odic(a(i, 1) & "_3") = a(i, 3) next i with worksheets("Sheet1") for i = 2 to 4 .cells(i, "X") = odic(.cells(i, "A") & "_2") .cells(i, "Y") = odic(.cells(i, "A") & "_3") next i end with end sub たとえば: sub macro2() dim oDic as object dim h as range dim i as long set odic = createobject("Scripting.Dictionary") for each h in worksheets("Sheet2").range("A2:A3") odic(h.value) = h.offset(0, 1).resize(1, 2).value next with worksheets("Sheet1") for i = 2 to 4 .cells(i, "X").resize(1, 2).value = odic(.cells(i, "A").value) next i end with end sub
その他の回答 (1)
- pringlez
- ベストアンサー率36% (598/1630)
>Scripting.Dictionaryで辞書に格納できるデータに >なにかしらの制限があるのでしょうか? …このコードだったら、そもそもそういう問題ではないでしょうね。 連想配列云々は全く関係ない気がするのですが。 おそらくは Ary(1, 1) = 2 Ary(2, 1) = 4 Ary(1, 2) = 3 Ary(2, 2) = 5 だということが絶対的な前提なのですよね。 まず、それができているのかどうかを確かめましょう。 あなたの場合は、そもそもデバッグの仕方を覚えるところからはじめた方がいいと思います。デバッグの仕方はわかりますか?Debug.print などを使って中身の確認をしてみましょう。
お礼
仰る通り、debug.printでイミディエイトウィンドウを確認してみたところ、きちんと、 oDict(Ary(1, 1)) = 2 oDict(Ary(2, 1)) = 4 oDict(Ary(1, 2)) = 3 oDict(Ary(2, 2)) = 5 の値が格納されていました。 Sheet1のA列に りんご りんご ばなな ばなな ばなな りんご のデータがあり、X列に 2 2 4 4 4 2 Y列に 3 3 5 5 5 3 を反映させたかったのですが、 Ary(i, 25) = oDict(Ary(i, 2)) は、ary(i,2)の値に対応したItemを返すので、ary(i,2)に仮に2の値が入っていれば3を返すという意味なんですね。 連想配列に対する理解が足りなかったことがわかりました。 きちんとデータは格納されていたにも関わらず、その取り出し方が間違っていたということですね。 ありがとうございました。
お礼
私の言いたいことがものすごく分かり辛かったにもかかわらず、勘違いしているところと、やりたいことを予測し、的確なコードをご提示いただいてありがとうございます。 Keyとなる値に文字列を追加する方法と、Keyとなる値に対し、Itemを範囲で指定して格納する方法ですね。 目から鱗が落ちたとはまさにこのことです。 配列に取り込んで処理することと、書き出したいセルが隣り合っていないことも想定し、macro1の方法でやってみたいと思います。 ありがとうございました。