Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OS = Worksheets("Feuil1") 'définit l'onglet OS
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For Each O In Sheets 'boucle sur tous les onglets O du classeur
Application.DisplayAlerts = False 'empêche les messages d'Excel
If Not O.Name = "Feuil1" Then O.Delete 'si le nom de l'onglet de la boucle n'est pas "Feuil1", supprime l'onglet
Application.DisplayAlerts = True 'autorise les messages d'Excel
Next O 'prochain onglet de la boucle
For I = 2 To UBound(TV, 1) 'boucle surt toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set O = Worksheets(TV(I, 4)) 'définit l'onglet O avec le nom (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'supprime l'erreur
Set O = Worksheets.Add(After:=Sheets(Sheets.Count)) 'définit l'onglet O en ajoutant un onglet vierge en dernière position
O.Name = TV(I, 4) 'renome l'onglet avec le nom
End If 'fin de la condition
O.Range("A1").Resize(1, UBound(TV, 2)).Value = Application.Index(TV, 1) 'renvoie la première ligne de TV
Set DEST = O.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellue de destination DEST
If TV(I, 4) = O.Name Then DEST.Resize(1, UBound(TV, 2)).Value = Application.Index(TV, I) 'renvoie la ligne I de TV dans DEST
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub