できあがったVBAです。標準モジュールにコピーして貼り付けて実行してください。最初の方のシート名や列名が実際のものと異なったら、その部分を書き換えてください。
Sub データ照合()
Dim WS(3) As Worksheet
Set WS(1) = Worksheets("Sheet1") '補助元帳データのシート名
Set WS(2) = Worksheets("Sheet2") '入金データのシート名
Set WS(3) = Worksheets("Sheet3") '一致しないデータのシート名
Dim WS3Title(2) As String '一致しないデータのシートのタイトル
WS3Title(1) = "補助元帳不一致データ(入金データに存在しないデータ)"
WS3Title(2) = "入金不一致データ(補助元帳に存在しないデータ)"
Dim WSKari(2) As String
Dim WSKashi(2) As String
Dim WSAll(2) As Integer
Dim WSDate(2) As String
WSDate(1) = "A" '補助元帳データの日付列
WSKari(1) = "J" '補助元帳データの借方列
WSKashi(1) = "K" '補助元帳データの貸方列
WSAll(1) = 11 '補助元帳データの列数
WSDate(2) = "B" '入金データの日付列
WSKari(2) = "D" '入金データの借方列
WSKashi(2) = "E" '入金データの貸方列
WSAll(2) = 12 '入金データの列数
Const WS3Date As String = "A" '一致しないデータの日付列
Const WS3Kari As String = "B" '一致しないデータの借方列
Const WS3Kashi As String = "C" '一致しないデータの貸方列
Dim Color(2) As Integer
Color(0) = xlColorIndexNone '無色
Color(1) = 36 '1つだけ一致する色(薄い黄色)
Color(2) = 38 '複数一致する色(薄いピンク)
Dim WS1Num() As Integer, WS2Num() As Integer 'それぞれのシートの重複データ数
Dim WSCount(2) As Integer 'それぞれのシートのデータ数
Dim Count As Integer, n As Integer, i1 As Integer, i2 As Integer
Application.ScreenUpdating = False
'最初に両シートの背景色をクリア
WS(1).Range("A1").CurrentRegion.Interior.ColorIndex = Color(0)
WS(2).Range("A1").CurrentRegion.Interior.ColorIndex = Color(0)
'マッチング開始
WSCount(1) = WS(1).Cells(Rows.Count, WSDate(1)).End(xlUp).Row
WSCount(2) = WS(2).Cells(Rows.Count, WSDate(2)).End(xlUp).Row
ReDim WS1Num(WSCount(1))
ReDim WS2Num(WSCount(2))
ReDim WS1NoMatch(WSCount(1))
ReDim WS2NoMatch(WSCount(2))
'1パス目:各シート内で同日付、同金額のデータ検索
'テンポラリのシートを追加
Dim TmpWS As Worksheet
With Worksheets
Set TmpWS = .Add(after:=Worksheets(.Count))
End With
For n = 1 To 2 'シートのループ
For i1 = 1 To 2 '借方と貸方のループ
TmpWS.Cells.ClearContents
'テンポラリのシートに日付と金額をコピー
TmpWS.Rows(1).Delete
For i2 = 2 To WSCount(n) + 1
If i1 = 1 And WS(n).Cells(i2, WSKari(n)) <> "" Then
TmpWS.Cells(i2, "A") = WS(n).Cells(i2, WSDate(n))
TmpWS.Cells(i2, "B") = WS(n).Cells(i2, WSKari(n))
TmpWS.Cells(i2, "C") = i2
ElseIf i1 = 2 And WS(n).Cells(i2, WSKashi(n)) <> "" Then
TmpWS.Cells(i2, "A") = WS(n).Cells(i2, WSDate(n))
TmpWS.Cells(i2, "B") = WS(n).Cells(i2, WSKashi(n))
TmpWS.Cells(i2, "C") = i2
End If
Next
'日付と金額でソート
TmpWS.Columns("A:C").Sort Key1:=Range("A1"), Key2:=Range("B1"), Header:=xlNo
For i2 = 1 To TmpWS.Cells(Rows.Count, 1).End(xlUp).Row
If n = 1 Then
If i2 = 1 Then
If TmpWS.Cells(i2, "A") = TmpWS.Cells(i2 + 1, "A") _
And TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 + 1, "B") Then
WS1Num(TmpWS.Cells(i2, "C")) = 2
Else
WS1Num(TmpWS.Cells(i2, "C")) = 1
End If
Else
If TmpWS.Cells(i2, "A") = TmpWS.Cells(i2 - 1, "A") _
And TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 - 1, "B") _
Or TmpWS.Cells(i2, "A") = TmpWS.Cells(i2 + 1, "A") _
And TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 + 1, "B") Then
WS1Num(TmpWS.Cells(i2, "C")) = 2
Else
WS1Num(TmpWS.Cells(i2, "C")) = 1
End If
End If
Else
If i2 = 1 Then
If TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 + 1, "B") Then
WS2Num(TmpWS.Cells(i2, "C")) = 2
Else
WS2Num(TmpWS.Cells(i2, "C")) = 1
End If
Else
If TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 - 1, "B") _
Or TmpWS.Cells(i2, "B") = TmpWS.Cells(i2 + 1, "B") Then
WS2Num(TmpWS.Cells(i2, "C")) = 2
Else
WS2Num(TmpWS.Cells(i2, "C")) = 1
End If
End If
End If
Next
Next
Next
Application.DisplayAlerts = False
TmpWS.Delete
Application.DisplayAlerts = True
'2パス目:両シートをつきあわせて色をつける
For i1 = 2 To WSCount(1)
Application.StatusBar = "処理実行中 " & i1 & "/" & WSCount(1) & "完了"
For i2 = 2 To WSCount(2)
If WS(1).Cells(i1, WSDate(1)) = WS(2).Cells(i2, WSDate(2)) Then
If WS(1).Cells(i1, WSKari(1)) <> "" _
And WS(1).Cells(i1, WSKari(1)) = WS(2).Cells(i2, WSKari(2)) _
Or WS(1).Cells(i1, WSKashi(1)) <> "" _
And WS(1).Cells(i1, WSKashi(1)) = WS(2).Cells(i2, WSKashi(2)) Then
WS(1).Cells(i1, 1).Resize(1, WSAll(1)).Interior.ColorIndex = _
Color(Application.WorksheetFunction.Max(WS1Num(i1), WS2Num(i2)))
WS(2).Cells(i2, 1).Resize(1, WSAll(2)).Interior.ColorIndex = _
Color(Application.WorksheetFunction.Max(WS1Num(i1), WS2Num(i2)))
End If
End If
Next
Next
'最終ステップ:一致しないデータのシート作成
Dim WS3Row As Integer '一致しないデータを記入する行番号
WS3Row = 1
WS(3).UsedRange.ClearContents
For n = 1 To 2
'タイトル作成
WS(3).Cells(WS3Row, "A").Value = WS3Title(n)
WS3Row = WS3Row + 1
WS(3).Cells(WS3Row, WS3Date).Value = "日付"
WS(3).Cells(WS3Row, WS3Kari).Value = "借方"
WS(3).Cells(WS3Row, WS3Kashi).Value = "貸方"
'一致しないデータを転記
For i1 = 1 To WSCount(n)
If WS(n).Cells(i1 + 1, WSDate(n)).Interior.ColorIndex = Color(0) Then
WS3Row = WS3Row + 1
WS(3).Cells(WS3Row, WS3Date) = WS(n).Cells(i1 + 1, WSDate(n))
WS(3).Cells(WS3Row, WS3Kari) = WS(n).Cells(i1 + 1, WSKari(n))
WS(3).Cells(WS3Row, WS3Kashi) = WS(n).Cells(i1 + 1, WSKashi(n))
End If
Next
WS3Row = WS3Row + 1
Next
Application.StatusBar = ""
MsgBox "完了しました", vbInformation
End Sub
お礼
いつもありがとうございます。 早速ダミーデータを入れてマクロを実行しました。 完了です!というメッセージがでて 各シートをみると塗りつぶし、不一致データの転記がされないのです。 自分ではどうしてこうなるのかわかりません。 注記(緑の説明文)の通りにシート名や項目列を書き換えて実行しました。 原因をどうやって追究したらよいか… 最後のメッセージまでエラーはありませんでした。 なぜなのでしょう。 もう一度見直してみます。