Bonjour Rbmicho, bonjour le forum,
Le code ci-dessous génère un onglet par Référence :
Sub Macro1()
Dim OB As Worksheet 'déclare la variable OB (Onglet Base)
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 Long 'déclare la variable I (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.Calculation = xlCalculationManual 'mode de calcul manuel
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OB = Worksheets("BASE AT") 'définit l'onglet OB
TV = OB.Range("A1").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 (en partant de la seconde)
If TV(I, 13) <> "" Then D(TV(I, 13)) = "" 'alimente le dictionnaire avec les données en colonne 13 (=> colonne M, les références) si non vides
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionaire D sans doublon
For I = 0 To UBound(TMP) 'boucle sur toutes les références J du tableau temporaire TMP
On Error Resume Next 'gestion des erreurs (en cas dérreur passe à la ligne suivante)
Set OD = Worksheets(CStr(TMP(I))) 'définit l'onglet destination OD (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
Worksheets.Add before:=Sheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
Set OD = ActiveSheet 'définit l'onglet OD
OD.Name = CStr(TMP(I)) 'renome l'onglet
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
OD.Cells.Clear 'efface le contenu de l'onglet OD
OB.ListObjects("BASEAT").Range.AutoFilter Field:=13, Criteria1:=TMP(I) 'filtre la base selon le ctitère TMP(J)
OB.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy OD.Range("A1") 'copie la base filtrée et la colle dans A1 de l'onglet OD
OB.ListObjects("BASEAT").Range.AutoFilter 'supprime le filtre de la base
Next I 'prochain critère de la boucle
Application.Calculation = xlCalculationAutomatic 'mode de calcul automatique
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Traitement terminé !" 'message
End Sub