Sub Macro1()
Dim O As Object 'déclare la variable O (Onglet)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CEllule)
Dim NB As Integer 'déclare la variable NB (NomBre d'occurrences)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)
Dim TBD 'déclare le tableau de variables TBD (TaBleau des Dates)
Dim J As Integer 'déclare la variable J (incrément)
Dim DM As Date 'déclare la variable DM (Date Max)
Dim LDM As Long 'déclare la variable LDM (Ligne de la Date Max)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set O = Sheets("Feuil1") 'définit l'onglet O
DL = O.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 O
Set PL = O.Range("A2:A" & DL) 'définit la plage PL
For Each CEL In PL 'boucle 1 : sur toutes les cellules CEL de la plage PL (= tous les matricules)
NB = Application.WorksheetFunction.CountIf(PL, CEL.Value) 'définit la variable NB (le nombre d'occurrences du matricule dans la plage PL)
If NB > 1 Then 'condition : si NB est supérieur à un (si plusieurs matricules identiques)
Range("A1").AutoFilter Field:=1, Criteria1:=CEL.Value 'filtre la colonne 1 (=A) de l'onglet avec le matricule comme critère
Set PLV = PL.Offset(0, 8).SpecialCells(xlCellTypeVisible) 'définit la plage PLV (= plage visible des date de fin de carte de séjour)
ReDim TBD(1 To 2, 1 To NB) 'redimensionne le tableau TBD
For J = 1 To NB 'boucle 2 : sur le nombre d'occurrences
TBD(1, J) = PLV(J) 'récupère la date
TBD(2, J) = PLV(J).Row 'récupère le numéro de ligne
If DM < TBD(1, J) Then LDM = TBD(2, J) 'si la date max DM est inférieure à la date, la ligne de la date max LDM est égale à la ligne du tableau TBL
Next J 'prochaine occurrence de la boucle 2
For J = NB To 1 Step -1 'boucle inversée 3 : du nombre d'occurrences à 1
If TBD(2, J) <> LDM Then Rows(TBD(2, J)).Delete 'si la ligne du tableau TBD est différente de la ligne LDM, supprime la ligne
Next J 'prochaine occurrence de la boucle inversée 3
Range("A1").AutoFilter 'supprime le filtre automatique
End If 'fin de la condition
Next CEL 'prochaine cellule de la boucle 1
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub