J'ai recrée le fichier...
Ce qui m'étonne dans cet exemple c'est le vide en G4 et A9. Tu peux donc aussi faire comme ceci pour éviter les donnés sans en-tête
Option Explicit
Sub recap()
Dim fichier, tbl, i, j, wbk As Workbook, ligne, f As Worksheet, dico As Object, cle, nbl, nbc
Set dico = CreateObject("Scripting.Dictionary")
Application.DisplayAlerts = False
For Each f In Worksheets
If f.Name <> "compil" Then f.Delete
Next
Application.DisplayAlerts = True
' collecte les données du fichier source dans un tableau
fichier = Application.GetOpenFilename("fichier excel (*.xls), *.xls", , "Sélection de vos fichiers excel", , False)
If fichier = False Then Exit Sub
Set wbk = Workbooks.Open(fichier)
nbc = Range("A4").End(xlToRight).Column
nbl = Range("A4").End(xlDown).Row - 3
tbl = Range("A4").Resize(nbl, nbc)
wbk.Close
' crée les onglets
For j = 2 To UBound(tbl, 2)
dico(Left(tbl(1, j), 20)) = ""
Next
For Each cle In dico.keys
With ThisWorkbook
.Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = cle
End With
Sheets(cle).Cells(1, 1) = "PRODUIT"
Sheets(cle).Cells(1, 2) = "QUANTITE"
Next
' traite le tableau
For i = 2 To UBound(tbl)
For j = 2 To UBound(tbl, 2)
If tbl(i, j) <> "" And tbl(i, j) <> 0 Then
ligne = Sheets(Left(tbl(1, j), 20)).Cells(Rows.Count, 1).End(xlUp).Row + 1
Sheets(Left(tbl(1, j), 20)).Cells(ligne, 1) = tbl(i, 1)
Sheets(Left(tbl(1, j), 20)).Cells(ligne, 2) = tbl(i, j)
End If
Next
Next
End Sub
S'il fallait aller plus loin, si un jour ton fichier de base évoluait, il faudrait alors passer à une version où tu sélectionnes la plage à prendre en compte, y compris en-tête du tableau pour avoir les clients, mais en dehors des totaux.