|
お世話になります。以前、こちらでお世話になり下記のような
マクロを教えていただき使用しておりますが、一部変更したいので
ご教授願います。
Sheet1とSheet2のJ3セル以下の製造番号を対比して同じであれば
Sheet2のFG列より右に入っている数字やテキストなどすべてをSheet1の
同じ場所にコピーしたい
現行:下記マクロでSheet1のJ列の製造番号「1234」のFG列データ「ああああ」
があり、Sheet2に製造番号「1234」がないとマクロ実行した際、Sheet1の「ああああ」は消えてしまう。
改善点:Sheet1とSheet2の製造番号を比較し一致した場合のみSheet1のFG列より
右側のデータを上書き変更する。一致しない、またはSheet2には存在しない場合は
Sheet1のデータをそのまま残したい
Sub sample()
Dim dic As Object
Dim endRow As Long
Dim i As Long, j As Long
Dim v1(), v2(), v3()
With ThisWorkbook.Worksheets("Sheet1")
'Sheet1のJ列の最終行を取得
endRow = .Cells(.Rows.Count, "J").End(xlUp).Row
'Sheet1の製造番号を配列v1へ格納
v1() = .Range("J3:J" & endRow).Value
'Sheet1のメモを配列v2へ格納
v2() = .Range("FG3:IV" & endRow).Value
End With
'配列v1をループし辞書を作成する
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To Ubound(v, 1)
'製造番号に対応するメモの行を一旦、辞書に登録
If Not dic.exists(v1(i, 1)) Then
dic(v1(i, 1)) = i
End If
Next i
With ThisWorkbook.Worksheets("Sheet2")
'Sheet2のJ列の最終行を取得
endRow = .Cells(.Rows.Count, "J").End(xlUp).Row
'Sheet2の製造番号を配列v1へ格納
v1() = .Range("J3:J" & endRow).Value
'v3の配列サイズを決める
ReDim v3(1 To Ubound(v1, 1), 1 To UBound(v2, 2))
'配列v1をループし、製造番号に対応するメモを配列v3へ格納
For i = 1 To Ubound(v1, 1)
If dic.exists(v1(i, 1)) Then
For j = 1 To UBound(v3, 2)
v3(i, j) = v2(dic(v1(i, 1)), j)
Next j
End If
Next i
'配列v3をシートに出力する
.Range("FG3").Resize(UBound(v3, 1), _
UBound(v3, 2)).Value = v3()
End With
'配列クリア
Erase v1, v2, v3
'オブジェクト解放
Set dic = Nothing
End Sub
以上、長くなりましたがよろしくお願いいたします
|
|