既に解決済みですが参考情報として投稿させていただきます。
coco_bauerさんのディクショナリーを複数用意するという案もひとつの解決策ですが、参考までに他の案もご紹介させていただきます。
①ディクショナリーに参照行番号を格納する
提示いただいたコードではアイテムコードをキーに、品名を格納したディクショナリーを作成していました。
しかし今回取り出したいものは品名だけではないので、品名もカテゴリ名も引き出せるように"一時保管"シートの行番号を格納しておこう、という案です。
Sub sample()
Dim mydic As Object, mykey
Dim c, myval
Dim i As Long, n As Long
Sheets("集計結果").Activate
n = Sheets("一時保管").Cells(Rows.Count, 1).End(xlUp).Row
Set mydic = CreateObject("Scripting.Dictionary")
For i = 2 To n
If Not mydic.exists(Sheets("一時保管").Cells(i, 1).Value) Then
mydic.Add Sheets("一時保管").Cells(i, 1).Value, i
End If
Next i
n = Sheets("集計結果").Cells(Rows.Count, 3).End(xlUp).Row
On Error Resume Next
For i = 2 To n
Dim lRow As Long
lRow = mydic.Item(Cells(i, 3).Value)
Cells(i, 1).Value = Sheets("一時保管").Cells(lRow, 4)
Cells(i, 2).Value = Sheets("一時保管").Cells(lRow, 3)
Next i
Set mydic = Nothing
MsgBox "Finish."
End Sub
②ディクショナリーではなくセル範囲から検索する
あえてディクショナリー検索にこだわりがなければ、Find関数で直接セル範囲を検索する方法もあります。
"一時保管"シートの対象範囲からFind関数で一致するセルを見つけて、見つけたセルからOffset関数で2列ないし3列右隣のセルを取得する、という内容です。
Sub sample()
Dim lRow As Long
Dim rngSrch As Range
Dim rngFind As Range
Dim shtR As Worksheet
Dim shtW As Worksheet
Set shtR = Sheets("一時保管")
Set shtW = Sheets("集計結果")
'検索対象範囲(一時保管シートA列)の設定
Set rngSrch = shtR.Range(shtR.Cells(2, 1), shtR.Cells(shtR.Cells(Rows.Count, 1).End(xlUp).Row, 1))
'出力シート(集計結果シート)のデータ行をループ処理
For lRow = 2 To shtW.Cells(Rows.Count, "C").End(xlUp).Row
'検索範囲から一致するセルを検索
Set rngFind = rngSrch.Find(shtW.Cells(lRow, "C").Value)
If rngFind Is Nothing Then
Else
'見つかった場合
shtW.Cells(lRow, "A").Value = rngFind.Offset(0, 3).Value '見つけたセルの3列右(D列)の値を出力シートA列に出力
shtW.Cells(lRow, "B").Value = rngFind.Offset(0, 2).Value '見つけたセルの2列右(C列)の値を出力シートB列に出力
End If
Next
MsgBox "Finish."
End Sub
以上、別案を2つご紹介させていただきましたが、実現方法は他にもいろいろあります。
どれを採用するかは環境やメンテナンス性、個人の好みなどで決めていただければいいと思います。
参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/25 04:14