1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| Sub Compare()
Dim Kol As New Collection
Dim LastLig1 As Long, LastLig2 As Long, i As Long
Dim k As Byte, Exact As Byte
Dim c As Range, v As Range, w As Range
Dim Data1 As String, Data2 As String
Application.ScreenUpdating = False
With Sheets("Feuil2")
.AutoFilterMode = False 'Enlève le filtre automatique de feuil2
LastLig2 = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne remplie de feuil2
'-----------------------------------------------------------------
For i = 2 To LastLig2
On Error Resume Next
Kol.Add .Range("A" & i).Value, .Range("A" & i).Value 'Ici on crée une collection des id de feuil2 (sans doublons par construction)
On Error GoTo 0
Next i
'------------------------------------------------------------------
For i = 1 To Kol.Count 'On parcourt chaque élément de la collection des id
With Sheets("Feuil1")
.AutoFilterMode = False 'Enlève le filtre automatique de feuil1
LastLig1 = .Cells(Rows.Count, 1).End(xlUp).Row 'Dernière ligne remplie de feuil1
End With
.Range("A1").AutoFilter field:=1, Criteria1:=Kol(i) 'On filtre feuil2 sur chaque élément de la collection des id
Set c = Sheets("Feuil1").Range("A1:A" & LastLig1).Find(Kol(i), lookat:=xlWhole) 'On cherche si cet élément existe en feuil1
If Not c Is Nothing Then 'Si l'id existe en feuil1
Sheets("Feuil1").Range("A1").AutoFilter field:=1, Criteria1:=Kol(i) 'On filtre aussi feuil1 sur cet id
For Each v In .Range("A2:A" & LastLig2).SpecialCells(xlCellTypeVisible) 'on parcourt toutes les lignes visibles de feuil2 (résultat du filtre)
Data2 = vbNullString
For k = 1 To 12
Data2 = Data2 & "_" & .Cells(v.Row, k) 'On concatène les valeurs des cellules de A à L (pour chaque ligne de la plage filtée de feuil2)
Next k
For Each w In Sheets("Feuil1").Range("A2:A" & LastLig1).SpecialCells(xlCellTypeVisible) 'on parcourt toutes les lignes visibles de feuil1 (résultat du filtre)
Data1 = vbNullString
For k = 1 To 12
Data1 = Data1 & "_" & Sheets("Feuil1").Cells(w.Row, k) 'On concatène les valeurs des cellules de A à L (pour chaque ligne de la plage filtée de feuil1)
Next k
If Data1 = Data2 Then 'Si la ligne de feuil2 est identique à l'une des lignes de feuil1
Exact = 1 'On sort de la boucle de recherche sur feuil1 et on affecte à Exact la valeur 1
Exit For
End If 'Sinon, on colorie en rouge (peut être il faut passer par une valeur booléan mais bon, ça sera pour l'optimisation du code
Next w
.Range("A" & v.Row & ":L" & v.Row).Interior.ColorIndex = 3 + Exact
Exact = 0
Next v
Set c = Nothing
Else 'Si l'id de feuil2 n'existe pas dans feuil1
.Range("A2:L" & LastLig2).SpecialCells(xlCellTypeVisible).Interior.ColorIndex = 6 'On colorie la plage filtrée en feuil2 en jaune et on la copie en fin de feuil1
.Range("A2:L" & LastLig2).SpecialCells(xlCellTypeVisible).Copy Sheets("Feuil1").Range("A" & LastLig1 + 1)
End If
Next i
.AutoFilterMode = False
End With 'on enlève les filtres auto des 2 feuilles
Sheets("Feuil1").AutoFilterMode = False
End Sub |
Partager