Sub Macro1()
Dim AF As Worksheet 'déclare la variable AF (onglet A Facturer)
Dim EC As Worksheet 'déclare la variable EC (onglet Extract Client)
Dim OD As Worksheet 'déclare la variable OD (onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
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 K As Integer 'déclare la variable K (incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Application.ScreenUpdating = False 'masque les raffraîchissement d'écran
Set AF = Worksheets("A facturer") 'définit l'onglet AF
Set EC = Worksheets("Extract Client") 'définit l'onglet EC
TV = AF.Range("A4").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 2)) = "" 'alimente le dictionnaire D avec la donnée en colonne 2 de la boucle (le client)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
Application.DisplayAlerts = False 'empêche les messages d'Excel (en cas de suppression d'un onglet par exemple)
EC.Visible = True 'affiche l'onglet EC
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Worksheets(TMP(J)).Delete 'supprime l'onglet de l'élément TMP(J) de la boucle 1 (génère une erreur si cet onglet n'existe pas)
If Err <> 0 Then Err.Clear 'si une erreur a été générée, supprime l'erreur
On Error GoTo 0 'annule la gestion des erreurs
EC.Copy after:=Sheets(Sheets.Count) 'copy l'onglet EC en dernière position
Set OD = ActiveSheet 'définit l'onglet destination OD
OD.Name = TMP(J) 'remomme l'onglet OD avec TMP(J) comme nom
OD.Range("B1").Value = TMP(J) 'renvoie dans la cellule B1 de l'onglet OD la valeur de TMP(J)
K = 1 'initialise la variable K
Erase TL 'vide le tableau TL
For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If TMP(J) = TV(I, 2) Then 'si le client correspond au deux boucles
ReDim Preserve TL(1 To 9, 1 To K) 'redimensionne le tableau des lignes TL (9 lignes, K colonnes)
TL(1, K) = TV(I, 2) 'récupère dans la ligne 1 de TL la donnée en colonne 2 de TV (Client)
TL(2, K) = TV(I, 5) 'récupère dans la ligne 2 de TL la donnée en colonne 5 de TV (Libellé)
TL(3, K) = CLng(TV(I, 6)) 'récupère dans la ligne 3 de TL la donnée en colonne 6 de TV convertie en entier long (Date facturation)
TL(4, K) = TV(I, 9) 'récupère dans la ligne 4 de TL la donnée en colonne 9 de TV (Prix Total HT)
TL(5, K) = TV(I, 10) 'récupère dans la ligne 5 de TL la donnée en colonne 10 de TV (Prix Total TTC)
TL(6, K) = TV(I, 14) 'récupère dans la ligne 6 de TL la donnée en colonne 14 de TV (Nº Facture)
TL(7, K) = TV(I, 17) 'récupère dans la ligne 7 de TL la donnée en colonne 17 de TV (Adresse de Facturation)
TL(8, K) = TV(I, 18) 'récupère dans la ligne 8 de TL la donnée en colonne 18 de TV (Adresse Postale...)
TL(9, K) = TV(I, 19) 'récupère dans la ligne 9 de TL la donnée en colonne 19 de TV (Référence de Facturation...)
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition
Next I 'prchaine ligne de la boucle 2
Set DEST = OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST
DEST.Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL) 'renvoie dans DEST redimensionnée le tableau TL tranposé
OD.Columns(3).NumberFormat = "dd/mm/yyyy" 'format de date de la colonne 3 de l'onglet OD
OD.Columns.AutoFit 'largeur automatique de toutes les colonne de l'onglet OD
Next J 'prochain élément de la boucle 1
EC.Visible = False 'masque l'onglet EC
Application.DisplayAlerts = True 'affiche les messages d'Excel
End Sub