Sub Macro2()
Dim O As Object 'déclare la variable O (Onglets)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim TC(1 To 3) As String 'déclare le tableau de 3 variables TC (Tableau des Catégories)
Dim I As Byte 'déclare la variable I (Incrément)
Dim PLV As Range 'déclare la variable PLV (PLage Visible)
Dim LI As Integer 'déclare la variable LI (LIgne)
TC(1) = "Exploitation" 'définit la variable 1 du tableau TC
TC(2) = "Anomalie_process" 'définit la variable 2 du tableau TC
TC(3) = "Ecart_Stock" 'définit la variable 3 du tableau TC
For Each O In Sheets(Array("Janvier", "Février", "Mars", "Avril")) 'boucle 1 : sur tous les onglets de la liste (à adapter)
For I = 1 To 3 'boucle 2 : sur les 3 catégories
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet O
Set PL = O.Range("A3:Q" & DL) 'définit la plage PL
O.Range("A2").AutoFilter Field:=16, Criteria1:=TC(I) 'filtre la colonne 16 (=P) avec la catégorie TC(I) comme critère
On Error Resume Next 'gestion des erreurs (en cas dérreur passe à la ligne suivante)
Set PLV = PL.SpecialCells(xlCellTypeVisible) 'définit la plage PLV de cellules visibles de la plage PL (génère une erreur si aucune cellule visible après filtrage)
If Err <> 0 Then 'condition : si une erreur a été générée
Err.Clear 'efface l'erreur
GoTo suite 'va à l'étiquette "suite"
End If 'fin de la condition
On Error GoTo 0
LI = Sheets("Suivi " & TC(I)).Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
Application.Intersect(PLV, O.Columns(1)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 1)
Application.Intersect(PLV, O.Columns(13)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 2)
Application.Intersect(PLV, O.Columns(5)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 3)
Application.Intersect(PLV, O.Columns(16)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 4)
Application.Intersect(PLV, O.Columns(17)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 5)
suite: 'étiquette
On Error GoTo 0 'annule la gestion des erreur
O.Range("A2").AutoFilter 'supprime le filtre automatique
Next I 'prochaine catégorie de la boucle 2
Next O 'prochain onglet de la boucle 1
End Sub