Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OS = Worksheets("MAQUETTE") 'définit l'onglet source OS
DL = OS.Cells(Application.Rows.Count, "Z").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne Z de l'onglet source
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 9 To DL 'boucle sur toutes les lignes I de 9 à DL
D(OS.Cells(I, "Z").Value) = "" 'alimente le dictionnaire D avec les données de la colonne Z
Next I 'prochaine ligne de la boucle
TMP = D.keys 'récupère la liste du dictionnaire D sans doublons dans le tableau temporaire TMP
For I = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments I du tableau temporaire TMP
Sheets("MAQUETTE").Copy After:=Sheets(Sheets.Count) 'copie l'oglet "MAQUETTE" en dernière position
Set OD = ActiveSheet 'définit l'onglet destination OD
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
OD.Name = TMP(I) 'définit le nom de l'onglet OD avec le nom de l'élément TMP(I) (génère une erreur si l'onglet existe déja)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
Application.DisplayAlerts = False 'masque les messages d'Excel
Sheets(TMP(I)).Delete 'supprime l'onglet ayant TMP(I) comme nom
Application.DisplayAlerts = True 'affiche les messages d'Excel
OD.Name = TMP(I) 'définit le nom de l'onglet OD avec le nom de l'élément TMP(I)
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
For J = DL To 9 Step -1 'boucle 2 : inversée sur toutes les lignes J de DL a 9
If OD.Cells(J, "Z").Value <> TMP(I) Then OD.Rows(J).Delete 'si la cellule ligne J colonne Z de l'onglet OD n'est pas identique à l'élément TMP(I), supprime la ligne
Next J 'prochane ligne de la boucle inversée 2
Next I 'prochain élément de la boucle 1
Application.ScreenUpdating = False 'affiche les rafraîchissements d'écran
End Sub