例文を使って繰り返し業務を時短

【マクロ・VBA】縦(行)ループして複数ワードで一致させる

エクセル、マクロ、VBAでループして複数ワードで一致させる VBA

縦(行)ループ/二つのワードでマッチング

この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を、配列変数(一次)に取り出す
  • 新規シートを作成してアクティブ状態にして、結果を貼付け

コメント

タイトルとURLをコピーしました