Sub ventiler()
Dim x, derlig&, t, i1&, i2&, i
With Worksheets("GL") 'avec la feuille "GL"
Application.ScreenUpdating = False: Application.DisplayAlerts = False 'on fige l'écran et desactive les alertes
For Each x In ThisWorkbook.Worksheets 'pour chaque feuille de calcul de ce classeur
If x.Name <> "GL" Then x.Delete 'si son nom est différent de GL alors on efface la feuille de calcul
Next x
Application.DisplayAlerts = True 'on réactive les messages d'alerte
If .FilterMode Then .ShowAllData 'si un filtre est actif alors on affiche toutes les lignes
derlig = .Cells(.Rows.Count, "a").End(xlUp).Row 'dernière ligne des données
'on trie les huits première colonne selon le critère colonne A (Société)
.Range("a:o").Resize(derlig).Sort key1:=.Range("a1"), order1:=xlAscending, Header:=True
t = .Range("a1:a" & derlig) 'on transfère les valeurs de la colonne A dans ule tableau en mémoire t
'PRINCIPE : comme la colonne A est triée, on va partir de la ligne i1=2 et on va
'incrémenter i2 (à partir de i1) tant que la société est la même que celle de la ligne i1.
'Quand la société de la ligne(i2+1)sera différente de celle de la ligne i1, alors
'on copiera le bloc de lignes i1 à i2 sur une nouvelle feuille
'puis on recommencera la même chose à partir de la ligne i2+1 pour la nouvelle société.
'Un cas particulier est quand i2 est la dernière ligne des données : dans ce cas, il faut copier
'le bloc [i1,i2] mais sortir ensuite de la boucle puisqu'on sera arrivé à la fin des données.
'i1 est la première ligne des données à copier ; i2 sera la dernière ligne à copier
i1 = 2: i2 = i1 't(i1,1) est la société qu'on traite
Do 'boucle sans fin
If i2 = UBound(t) Then 'si i2 est la dernière ligne des données
ThisWorkbook.Worksheets.Add after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) 'créer une nouvelle feuille
.Range("1:1").Copy ActiveSheet.Range("1:1") 'copier les en-têtes dela feuille GL vers la nouvelle feuille
.Range(i1 & ":" & i2).Copy ActiveSheet.Range("2:2") 'copier les lignes de i1 à i2 vers la nouvelle feuille
ActiveSheet.Name = t(i1, 1) 'nommer la nouvelle feuille avec le nom idoine
ActiveSheet.Columns("a:o").EntireColumn.AutoFit 'ajuster la largeur des colonnes de la nouvelles feuille
Exit Do 'comme on a atteint la fin des données on sort de la boucle
ElseIf t(i2 + 1, 1) <> t(i2, 1) Then 'la société suivante sera différente de la société en cours
ThisWorkbook.Worksheets.Add after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count) 'créer une nouvelle feuille
.Range("1:1").Copy ActiveSheet.Range("1:1") 'copier les en-têtes dela feuille GL vers la nouvelle feuille
.Range(i1 & ":" & i2).Copy ActiveSheet.Range("2:2") 'copier les lignes de i1 à i2 vers la nouvelle feuille
ActiveSheet.Name = t(i1, 1) 'nommer la nouvelle feuille avec le nom idoine
ActiveSheet.Columns("a:o").EntireColumn.AutoFit 'ajuster la largeur des colonnes de la nouvelles feuille
'le nom de société suivant est une nouvelle société, on commencera la copie suivante à la ligne i2+1
i1 = i2 + 1: i2 = i2 + 1
Else
'la société suivante (i2+1)est idendique à la société courante i2, on doit donc
'inclure dans la copie la ligne i2 donc i2 passe à i2+1
i2 = i2 + 1
End If
Loop
End With
End Sub