• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[VBA] 連想配列について)

[VBA] 連想配列について

このQ&Aのポイント
  • VBAで連想配列の使い方について困っています。
  • データ量が多いため、VLOOKUPの代わりに連想配列を使いたいです。
  • しかし、コードの一部がうまく動作せず困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.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

rihitomo
質問者

お礼

私の言いたいことがものすごく分かり辛かったにもかかわらず、勘違いしているところと、やりたいことを予測し、的確なコードをご提示いただいてありがとうございます。 Keyとなる値に文字列を追加する方法と、Keyとなる値に対し、Itemを範囲で指定して格納する方法ですね。 目から鱗が落ちたとはまさにこのことです。 配列に取り込んで処理することと、書き出したいセルが隣り合っていないことも想定し、macro1の方法でやってみたいと思います。 ありがとうございました。

その他の回答 (1)

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

>Scripting.Dictionaryで辞書に格納できるデータに >なにかしらの制限があるのでしょうか? …このコードだったら、そもそもそういう問題ではないでしょうね。 連想配列云々は全く関係ない気がするのですが。 おそらくは Ary(1, 1) = 2 Ary(2, 1) = 4 Ary(1, 2) = 3 Ary(2, 2) = 5 だということが絶対的な前提なのですよね。 まず、それができているのかどうかを確かめましょう。 あなたの場合は、そもそもデバッグの仕方を覚えるところからはじめた方がいいと思います。デバッグの仕方はわかりますか?Debug.print などを使って中身の確認をしてみましょう。

rihitomo
質問者

お礼

仰る通り、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を返すという意味なんですね。 連想配列に対する理解が足りなかったことがわかりました。 きちんとデータは格納されていたにも関わらず、その取り出し方が間違っていたということですね。 ありがとうございました。

関連するQ&A

専門家に質問してみよう