Compilation de plusieurs onglets sur un seul par filtre [Résolu]

le_sablais

XLDnaute Nouveau
Bonjour à tous,

Me voilà avec une problématique de compilation de données.

Contexte :

J'ai un fichier avec plusieurs onglets par mois (Janvier, Février, Mars etc) qui regroupe plusieurs informations. Dans mon fichier original il y a environ 1000 lignes par mois.
Dans chaque mois il y a une colonne "Catégories". Il existe 3 catégories différentes que l'on peut mettre dans cette colonne : Exploitation, Anomalie_Process et Ecart_Stock.
Je souhaiterais pouvoir réunir toutes les "exploitation", "anomalie_process" et "ecart_stock" dans des onglets dédiés, afin de créer par la suite tableaux et graphiques.

J'ai essayé de faire cela par filtres élaborés, cela fonctionne pour le 1er mois, mais les mois suivants se rajoutent systématiquement par-dessus.

existe-t-il une solution (VBA ou non) pour que chaque catégorie de chaque mois se compile à la suite dans les onglets dédiés. J'ai passé beaucoup de temps à réfléchir à la question. Par vba, en cherchant la première cellule vide, ça ne fonctionne pas car (je pense) que ça ne trouve pas les en-têtes pour se coller.

Je ne sais pas si tout ça est clair, s'il y a des questions, je n'hésiterais pas à y répondre.

Je joins un fichier très simplifié, mais avec le même esprit.

Merci d'avance pour les réponses à venir :)

Le_sablais
 

Pièces jointes

  • compilation de données par filtre.xlsx
    30.2 KB · Affichages: 19
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Compilation de plusieurs onglets sur un seul par filtre

Bonjour Le_sablais, bonjour le forum,

En pièce jointe ton fichier modifié avec le code ci-dessous :
Code:
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)

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("A2:D" & DL) 'définit la plage PL
        O.Range("A1").AutoFilter Field:=4, Criteria1:=TC(I) 'filtre la colonne 4 (=D) 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
        PLV.Copy Sheets("Suivi " & TC(I)).Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'copie la plage PLV dans l'onglet correspondant
suite: 'étiquette
        On Error GoTo 0 'annule la gestion des erreur
        O.Range("A1").AutoFilter 'supprime le filtre automatique
    Next I 'prochaine catégorie de la boucle 2
Next O 'prochain onglet de la boucle 1
End Sub
Le fichier :
 

Pièces jointes

  • Le_sablais_v1.xlsm
    42.3 KB · Affichages: 21
  • Le_sablais_v1.xlsm
    42.3 KB · Affichages: 23
  • Le_sablais_v1.xlsm
    42.3 KB · Affichages: 28
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Compilation de plusieurs onglets sur un seul par filtre

Bonsoir à tous


Y a de l'idée mais cela coince encore un chouia
Si quelqu'un pouvait éclairer ma lanterne, le temps que je finisse de souper ;)
Code:
Sub Macro1()
Dim ArrFS, ArrFD, i, j, dl&
ArrFS = Array("Janvier", "Février", "Mars", "Avril")
ArrFD = Array("Suivi Exploitation", "Suivi Anomalie_Process", "Suivi Ecart_Stock")
dl = 1
For i = 0 To UBound(ArrFD)
For j = 0 To UBound(ArrFS)
Sheets(ArrFS(j)).Range("A1:D59").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Range("'" & ArrFD(i) & "'!G2:G3"), CopyToRange:=Range( _
        "'" & ArrFD(i) & "'!A" & dl & ":D" & dl), Unique:=False
    dl = Sheets(ArrFD(i)).Cells(Rows.Count, 1).End(xlUp).Row + 1
Next j
Next i
End Sub

NB: Ça marche très bien si je passe par N macros (pour chaque feuille)
Code:
Sub MacroEnregistree()
Sheets("Janvier").Range("A1:D59").AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range("'Suivi Exploitation'!G2:G3"), CopyToRange:=Range( _
"'Suivi Exploitation'!A1:D1"), Unique:=False
End Sub
 

le_sablais

XLDnaute Nouveau
Re : Compilation de plusieurs onglets sur un seul par filtre

Merci à vous deux pour vos réponses.

Robert, ta solution me parait excellente, cependant j'ai des difficultés à l'adapter sur mon fichier... Je joins un fichier qui "ressemble" plus à mon fichier final. ça pourrait me débloquer.

Staple1600, ta deuxième solution était ma première idée, sauf que ça efface au fur et à mesure les mois déjà filtrés.

Merci encore pour vos réponses

Le_sablais
 

Pièces jointes

  • Le_sablais_v1.xlsm
    54.7 KB · Affichages: 17
  • Le_sablais_v1.xlsm
    54.7 KB · Affichages: 23
  • Le_sablais_v1.xlsm
    54.7 KB · Affichages: 28

Robert

XLDnaute Barbatruc
Repose en paix
Re : Compilation de plusieurs onglets sur un seul par filtre

Bonjour le fil, bonjour le forum,

Après avoir remplacé le nom de l'onglet Suivi Anomalies_Process par Suivi Animalie_Process, avoir remplacé dans le code toutes les occurrences de "Suivi" par "Suivi " (avec un espace derrière). Après avoir adapté la plage :
Code:
Set PL = O.Range("A3:Q" & DL) 'définit la plage PL
et le Field :
Code:
O.Range("A2").AutoFilter Field:=16, Criteria1:=TC(I) 'filtre la colonne 16 (=P) avec la catégorie TC(I) comme critère
Cela semble fonctionner...
Le code :
Code:
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
Le fichier :
 

Pièces jointes

  • Le_sablais_v2.xlsm
    56.3 KB · Affichages: 27
Dernière édition:

le_sablais

XLDnaute Nouveau
Re : Compilation de plusieurs onglets sur un seul par filtre

Merci Robert,

cela fonctionne très bien sur le fichier que tu m'as envoyé. Cependant, lorsque j'ai copié le code sur mon fichier afin de l'adapter, j'ai une erreur lors de l'exécution.

Erreur d'exécution '9'
L'indice n'appartient pas à la sélection

débogage sur la ligne suivante : LI = Sheets("Suivi " & TC(I)).Cells(Application.Rows.Count, 1).End(xlUp).Row + 1
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Compilation de plusieurs onglets sur un seul par filtre

Bonjour Le Sablais, bonjour le forum,

Cela signifie que le nom d'une des variables TC n'est pas strictement identique au nom de l'onglet correspodant. Comme je t'ai dit dans mon post précédent, dans ton exemple, tu avais un onglet nommé Suivi Anomalies_Process (avec un s à Anomalies) et la variable TC(2) est égale à Anomalie_Process (sans le s à Anomalie).
Du coup la ligne citée plante puisque l'onget : Suivi Anomalie_Process (sans s) n'existe pas !
Tu dois corriger ou l'un ou l'autre pour que ce soit cohérent et aussi lire les explications que je te fournis...
Sinon ça sert à qoi que Ducros y se décarcasse ?
 

le_sablais

XLDnaute Nouveau
Re : Compilation de plusieurs onglets sur un seul par filtre

J'avais bien lu tes (très précieuses) explications. J'avais bien commencé directement par modifié ce fameux "s". Mais en effet, erreur d'inatention de ma part, mauvais enregistrement, donc mal modifié haha.

Le code fonctionne bien sur mon fichier, seul reste la colonne "dates" qui ne s'affiche pas.

Merci encore :)
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Compilation de plusieurs onglets sur un seul par filtre

Bonjour Le Sabais, bonjour le forum,

Oui c'est de ma faute ! Je me suis trompé de colonne... Remplace la ligne :
Code:
Application.Intersect(PLV, O.Columns(13)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 2)
par :
Code:
Application.Intersect(PLV, O.Columns(2)).Copy Sheets("Suivi " & TC(I)).Cells(LI, 2)
Ou plutôt remplace le 13 par un 2...
 

Staple1600

XLDnaute Barbatruc
Re : Compilation de plusieurs onglets sur un seul par filtre [Résolu]

Bonsoir à tous

Grâce à la lampe de poche d'Efgé (merci à toi;) ) qui est venu éclairer ma lanterne en MP.
J'ai pu trouver le chemin pour modifier mon précédent code pour et le rendre fonctionnel.
(pas d'effacement des mois précédents)

VB:
Sub Macro1_C()
Dim ArrFS, ArrFD, i, j, pf As Range

ArrFS = Array("Janvier", "Février", "Mars", "Avril")
ArrFD = Array("Suivi Exploitation", "Suivi Anomalie_Process", "Suivi Ecart_Stock")


For i = 0 To UBound(ArrFD)
    For j = 0 To UBound(ArrFS)
    Sheets(ArrFS(j)).Range("A1:D59").AdvancedFilter Action:=xlFilterInPlace, _
    CriteriaRange:=Sheets(ArrFD(i)).Range("G2:G3"), Unique:=False
    Set pf = Sheets(ArrFS(j)).Range("_FilterDataBase")
    On Error Resume Next
    pf.Offset(1, 0).Resize(pf.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy Sheets(ArrFD(i)).Cells(Rows.Count, 1).End(3)(2).Resize(1, 4) '<- ici le faisceau de la lampe d'Efgé ;)
    Set pf = Nothing
    Sheets(ArrFS(j)).ShowAllData
    Next j
Next i
End Sub
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : Compilation de plusieurs onglets sur un seul par filtre [Résolu]

Bonjour à tous :)
Staple, ça ne change pas le fait qu'il faut supprimer les entêtes de plages pour chaque copie :D

Ma version, avec filtre avancé, les feuilles sont crées suivant les valeurs présentent.


Cordialement
 

Pièces jointes

  • Le_sablais_v1 (1).xlsm
    153.8 KB · Affichages: 22

Efgé

XLDnaute Barbatruc
Re : Compilation de plusieurs onglets sur un seul par filtre [Résolu]

Re
Avec mon fichier :
Tu clic une fois sur le bouton, pour créer les feuilles nécessaires, puis alt+F8 Macro1_C.
Regarde la ligne 54 de la feuille Suivi Exploitation ; )
(Ce n'est pas le résultat qu'il faut regarder, ton code est prévu pour 4 colonnes, le mien pour 17, d'où différences)
Cordialement
 

Staple1600

XLDnaute Barbatruc
Re : Compilation de plusieurs onglets sur un seul par filtre [Résolu]

Re


Efgé
Je teste mon dernier code sur la PJ du premier message du fil
Et je viens de refaire le test, il n'y pas de lignes d'entêtes recopiées entre chaque copie.
(Il y a a juste les entêtes (mais ils étaient là au départ) en ligne 1 )
Par exemple sur le feuille Suivi Exploitation, après exécution de ma macro, on a des données de A2 à A185
et les seuls entêtes que l'on voit sont en ligne 1.

On est bien d'accord cette fois, non ?
Sinon j'appelle l'infirmière pour qu'elle me confirme que je suis sain d'esprit ;)
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin