【お題】引っかけ問題(締め切り10月27日(日)23時)

いつもお世話になっております。
連想配列の質問ですが、
下記のように書き出したいのですが、
おしえてくれませんでしょうか

ReDim Preserve Vz(1 To UBound(Vz), 1 To 2)
に格納したものを

Cells(i, "i") = Vz(iB, 1)
Cells(i, "J") = Vz(iB, 2)
ように書きだしたいのです。
おしえてくれませんでしょうか


Sub fa()
Dim Dic As Object
Dim Vz As Variant, Vk
Dim iA As Long, iB As Long
Set Dic = CreateObject("Scripting.Dictionary")

With Range("B2").CurrentRegion
Vk = .Value
End With

For iA = UBound(Vk) To 3 Step -1
If (Vk(iA, 1)) <> "" Then _
Dic(Vk(iA, 1)) = iA

Next

With ActiveSheet
With .Range("H2", .Cells(Rows.Count, "H").End(xlUp))
Vz = .Value


ReDim Preserve Vz(1 To UBound(Vz), 1 To 2)
For iB = 2 To UBound(Vz)
iA = Dic(Vz(iB, 1))

If (iA = 0) Then
Vz(iB, 1) = ""
Else
Vz(iB, 1) = Vk(iA, 2)
Vz(iB, 2) = Vk(iA, 3)
End If



Cells(i, "i") = Vz(iB, 1)
Cells(i, "J") = Vz(iB, 2)
Next

End With
End With
End Sub

「連想配列について」の質問画像

質問者からの補足コメント

  • うーん・・・

    いつもお世話になっております。
    For i = LBound(Vz) To UBound(Vz)

    Cells(i + 1, "i") = Vz(i, 1)
    Cells(i + 1, "J") = Vz(i, 2)

    Next
    でやりましたが、
    4だけ 4と表示されます。



    4 4
    5 沼田 梨恵子 女
    6 本多 八洲子 女
    7 石井 芙美子 女
    8 亀井 水泉  男
    9 白井 真樹  女
    10 柏木 悠里  女
    11 村松 利人  男

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/12/15 21:17
  • うーん・・・

    Vz は最後に Resize を用いて一括出力しないと使用している意味が薄まるかなと。
    なんとなくですが、
    ReDim Preserve Vz(1 To UBound(Vz), 1 To 2)
    格納して 一気に吐き出す 速さがおちるということですか

      補足日時:2021/12/15 21:23

A 回答 (1件)

連想配列ではなく2次元配列のように思いますけど、配列のインデックス№はシートの行番号とは一致しませんよ。


⇒1行目に項目行があってその項目名を取得するなら別ですけど。

UBound と共に LBound も知っておくと良いかも。

【VBA入門】UBound、LBound関数で配列の要素数を取得
https://www.sejuku.net/blog/29317

あとは配列変数:Vz は最後に Resize を用いて一括出力しないと使用している意味が薄まるかなと。
この回答への補足あり
    • good
    • 0
この回答へのお礼

いつもお世話になっております
変更前
For iB =1 To UBound(Vz)
変更後
For iB = LBound(Vz) To UBound(Vz)

うまくいきました。
ありがとうございました。


ReDim Preserve Vz(1 To UBound(Vz), 1 To 2)
For iB = LBound(Vz) To UBound(Vz)
iA = Dic(Vz(iB, 1))

お礼日時:2021/12/15 21:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報