Public Sub Mask()
Dim s1 As Object 'déclare la variable s1 (onglet S1)
Dim s2 As Object 'déclare la variable s2 (onglet S2)
Dim dl1 As Integer 'déclare la variable dl1 (Dernière Ligne 1)
Dim pl1 As Range 'déclare la variable pl1 (PLage 1)
Dim dl2 As Integer 'déclare la variable dl2 (Dernière Ligne 2)
Dim pl2 As Range 'déclare la variable pl2 (PLage 2)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim tl() As Integer 'déclare le tableau de variables tl (Tableau de Lignes)
Dim i As Integer 'déclare la variable i (incrément)
Dim lf As Long 'déclare la variable lf
Set s1 = Sheets("S1") 'définit l'onglet s1
Set s2 = Sheets("S2") 'définit l'onglet s2
s1.Rows.Hidden = False 'affiche toutes les ligneS de l'onglet s1
dl1 = s1.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl1 de la colonne A de l'onglet s1
Set pl1 = s1.Range("A1:A" & dl1) 'définit la plage pl1
dl2 = s2.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl2 de la colonne A de l'onglet s2
Set pl2 = s2.Range("A2:A" & dl2) 'définit la plage pl2
'pl1.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True 'masque les lignes dont la cellule en A est vide
For Each cel In pl2 'boucle 1 : sur toutes les cellules de la plage pl2
i = 0 'réinitialise la variable i
'définit la recherche r1 (recherche la valeur de la cellule cel dans la plage pl1)
Set r = pl1.SpecialCells(xlCellTypeVisible).Find(cel.Value, , xlValues, xlWhole)
If Not r Is Nothing Then 'condition : si une occurrence est trouvée
pa = r.Address 'définit l'adresse de la première occurrence trouvée
Do 'exécute
ReDim Preserve tl(i) 'redimensionne le tableau de variables tl
tl(i) = r.Row 'définit la variable indexée tl(i)
i = i + 1 'incrémente i
Set r = pl1.SpecialCells(xlCellTypeVisible).FindNext(r) 'redéfinit la recherche r (occurrence suivante)
Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
For i = 0 To UBound(tl) 'boucle 2 : sur toutes les variables du tableau tl
'condition : si la cellule en dessous de la ligne à masquer n'est pas vide
If s1.Cells(tl(i), 1).Offset(1, 0).Value = "" Then
lf = s1.Cells(tl(i), 1).End(xlDown).Row - 1 'définit la ligne de fin (ligne avant la prochaine valeur)
Else 'sinon
lf = tl(i) 'définit la ligne de fin (même ligne)
End If 'fin de la condition
If tl(i) = dl1 Then lf = dl1 'si la ligne à masquer est la dernière ligne dl1, lf = dl1
Rows(tl(i) & ":" & lf).Hidden = True 'masque la ou les lignes correspondantes
Next i 'prochaine variable de la boucle 2
End If 'fin de la conditon
Next cel 'prochaine cellule de la boucle 1
End Sub