Sub Macro3()
Dim O1 As Object 'déclare la variable O1 (onglet 1)
Dim O2 As Object 'déclare la variable O2 (onglet 2)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim PLV As Range 'déclare la variable PLV (Plage Visible)
Dim C1 As Range 'déclare la variable C1 (Cellule 1)
Dim C2 As Range 'déclare la variable C2 (Cellule 2)
Dim DEST As Range 'déclare la variable DEST (celulle de DESTination)
Set O1 = Sheets("Feuil1") 'définit l'onglet O1
Set O2 = Sheets("Feuil2") 'définit l'onglet O1
DL = O1.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O1
Set PL = O1.Range("A2:A" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEl de la plage PL
D(CEL.Value) = "" 'alimente le diciotnnaire D
Next CEL 'prochaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP les éléments du dictionnaire D sans doublon
For I = 0 To UBound(TMP) 'boucle 1 sur les éléments du tableau TMP
O1.Range("A1").AutoFilter Field:=1, Criteria1:=TMP(I) 'filtre la colonne 1 (=A) de l'onglet O1 avec TMP(I) comme critère
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'de'finit la plage PLV (cellule visibles (non filtrées) de la plage PL
For Each C1 In PLV.Offset(0, 1) 'boucle 2 : sur toutes les cellule de la plage PLV
'boucle 3 : sur toutes les cellule de la plage PLV (moins la première ligne)
For Each C2 In PLV.Offset(1, 1).Resize(PLV.Rows.Count - 1, PLV.Columns.Count)
'condition : si la cellule C1 vaut - la cellule C2 et si C1 n'est pas colorée de rouge
If C1.Value = -C2.Value And C1.Interior.ColorIndex <> 3 Then
'définit la cellule de destination DEST (A1 si A1 est vide, sinon, première ligne vide de la colonne A de l'onglet O2)
Set DEST = IIf(O2.Range("A1").Value = "", O2.Range("A1"), O2.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0))
C1.EntireRow.Copy DEST 'copie la ligne de C1 dans DEST
C2.EntireRow.Copy DEST.Offset(1, 0) 'copie la ligne de C2 dans la ligne en dessous de DEST
C1.Interior.ColorIndex = 3: C2.Interior.ColorIndex = 3 'colore C1 et C2 de rouge
C1.Font.Bold = True: C2.Font.Bold = True 'attribut [Gras] pour C1 et C2
End If 'fin de la condition
Next C2 'prochaine cellule de la boucle 3
Next C1 'prochaine cellule de la boucle 2
O1.Range("A1").AutoFilter 'supprime le filtre automatique
Next I 'prochaine élément de la boucle 1
End Sub