縦(行)ループ/二つのワードでマッチング
このVBAコードは、2つのシートにあるデータをIDをキーにして結合し、新しいシートに出力するプログラムです。
Sub 複数ワードでマッチング()
Dim objDIC As Object
Set objDIC = CreateObject("Scripting.Dictionary")
Dim myKey As Variant
Dim i As Long
'アクティブシートのデータをA列(ID)をキーにして「objDIC」に格納
With ThisWorkbook.ActiveSheet
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
objDIC(.Cells(i, 1).Value) = _
.Cells(i, "B").Value & "," & .Cells(i, "E").Value & "," & .Cells(i, "T").Value
Next i
End With
'アクティブシートの隣のシートのデータでA列(ID)が「objDIC」に登録されていれば更新
'登録されていなければ「objDIC」に追加
With ThisWorkbook.ActiveSheet.Next
For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
objDIC(.Cells(i, 1).Value) = _
.Cells(i, "C").Value & "," & .Cells(i, "E").Value & "," & .Cells(i, "G").Value
Next i
End With
'「objDIC」からkeyを、配列変数(一次)に取り出す
myKey = objDIC.Keys
'新規シートを作成して出力
Worksheets.Add(After:=ActiveSheet).Name = ActiveSheet.Name & "_" & VBA.Format(Now(), "h時mm分ss秒")
With ThisWorkbook.ActiveSheet
For i = 1 To objDIC.Count
.Cells(i + 1, "A").Value = myKey(i - 1)
.Range(.Cells(i + 1, "B"), .Cells(i + 1, "D")).Value = _
Split(objDIC(myKey(i - 1)), ",")
Next i
End With
MsgBox "完了"
End Sub
解説
まず、Scripting.Dictionaryオブジェクトを作成し、データを格納するための変数(myKey)を定義します。アクティブシートのデータをループ処理して、A列(ID)をキーとしてobjDIC変数に格納します。そして、アクティブシートの隣のシートのデータをループ処理して、同様にA列(ID)がobjDICに登録されていれば更新し、登録されていなければ追加します。
次に、objDICからキーを取り出して、新しいシートに出力するための配列変数(myKey)に格納します。最後に、新しいシートを作成して、myKeyをループ処理して、IDと関連するデータを新しいシートに出力します。
このプログラムは、複数のデータセットをまとめるために使用されることがあります。例えば、複数のエクセルファイルからデータを抽出して1つのエクセルファイルにまとめる場合などに有用です。
- アクティブシートのデータをA列(ID)をキーにして「objDIC」に格納
- 「.Cells(i, “B”).Value & “,” & .Cells(i, “E”).Value & “,” & .Cells(i, “T”).Value」:
C列の値、E列の値、G列の値を「,(カンマ)」を挟みながら1つの文字列として連想配列(objDIC)のItem部に格納 - アクティブシートの隣のシートのデータでA列(ID)が「objDIC」に登録されていれば更新
とうろくされていなければ「objDIC」に追加 - 「objDIC」からkeyを、配列変数(一次)に取り出す
- 新規シートを作成してアクティブ状態にして、結果を貼付け
コメント