| 
    
     |  | データが無いので試していませんが? Sheet1、Sheet2共に列見出しが有る物とします
 Sheet1、Sheet2共に比較する列をKeyとして整列されます
 Sheet1、Sheet2に共通する比較値が有る場合は、
 Sheet2のC〜F列にSheet1のB〜E列の値を貼り付け
 
 Option Explicit
 Option Compare Text
 
 Public Sub DataMatch()
 
 'Sheet1のデータ列数(A列〜E列)
 Const clngColumns1 As Long = 5
 'Sheet1の比較する列の列位置(基準セル位置からの列Offset)
 Const clngKeys1 As Long = 0
 
 'Sheet2のデータ列数(C列〜G列)
 Const clngColumns2 As Long = 5
 'Sheet2の比較する列の列位置(基準セル位置からの列Offset)
 Const clngKeys2 As Long = 4
 
 Dim i As Long
 Dim j As Long
 Dim lngStart As Long
 Dim rngList1 As Range
 Dim vntList1 As Variant
 Dim lngRows1 As Long
 Dim rngList2 As Range
 Dim vntList2 As Variant
 Dim lngRows2 As Long
 Dim strProm As String
 
 'Sheet1のA1を基準とします
 Set rngList1 = Worksheets("Sheet1").Cells(1, "A")
 
 'Sheet2のD1を基準とする
 Set rngList2 = Worksheets("Sheet2").Cells(1, "C")
 
 '画面更新を停止
 Application.ScreenUpdating = False
 
 'Sheet1の基準に就いて
 With rngList1
 '行数を取得
 lngRows1 = .Offset(Rows.Count - .Row, _
 clngKeys1).End(xlUp).Row - .Row
 'データが無ければ
 If lngRows1 <= 0 Then
 strProm = rngList1.Value & "にデータが有りません"
 GoTo Wayout
 End If
 'データをA列で整列
 DataSort .Offset(1).Resize(lngRows1, _
 clngColumns1 + 1), .Offset(1, clngKeys1)
 '比較用配列にデータを取得
 vntList1 = .Offset(1, clngKeys1).Resize(lngRows1 + 1).Value
 End With
 
 'Sheet2基準に就いて
 With rngList2
 '行数を取得
 lngRows2 = .Offset(Rows.Count - .Row, _
 clngKeys2).End(xlUp).Row - .Row
 'データが無ければ
 If lngRows2 <= 0 Then
 strProm = rngList2.Value & "にデータが有りません"
 GoTo Wayout
 End If
 'データをG列で整列
 DataSort .Offset(1).Resize(lngRows2, _
 clngColumns2 + 1), .Offset(1, clngKeys2)
 '比較用配列にデータを取得
 vntList2 = .Offset(1, clngKeys2).Resize(lngRows2 + 1).Value
 End With
 
 'Sheet2の比較開始位置を設定
 lngStart = 1
 For i = 1 To lngRows1
 For j = lngStart To lngRows2
 'Matchiした場合
 If vntList1(i, 1) = vntList2(j, 1) Then
 'Sheet2のC〜F列にSheet1のB〜E列の値を貼り付け
 rngList2.Offset(j).Resize(, 4).Value _
 = rngList1.Offset(i, 1).Resize(, 4).Value
 Else
 'Sheet1の値がSheet2の値より小さい場合、Forを抜ける
 If vntList1(i, 1) < vntList2(j, 1) Then
 Exit For
 End If
 End If
 Next j
 'D列の比較開始位置を更新
 lngStart = j
 Next i
 
 strProm = "処理が完了しました"
 
 Wayout:
 
 '画面更新を再開
 Application.ScreenUpdating = True
 
 Set rngList1 = Nothing
 Set rngList2 = Nothing
 
 MsgBox strProm, vbInformation
 
 End Sub
 
 Private Sub DataSort(rngScope As Range, _
 rngKey As Range, _
 Optional lngOrientation As Long = xlTopToBottom)
 
 rngScope.Sort _
 Key1:=rngKey, Order1:=xlAscending, _
 Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
 Orientation:=lngOrientation, SortMethod:=xlStroke
 
 End Sub
 
 |  |