[RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

lennynero256

XLDnaute Junior
Bonjour,

j'ai un classeur comprenant une feuille "SYNTHESE" avec un tableau global (par colonne : ville, activité, age)

j'essaie de faire une macro qui me permettrait d'afficher les données triées par critères sur d'autres feuilles du même classeur.

ex : une feuille A ou les données seraient triées par ville, une autre B par activité et une autre C par âge. J'essaie d'adapter une macro trouvée sur le forum, mais elle ne fonctionne pas.

Voici pour un copier coller sur la feuille A

Code:
Sub CopierAvecFiltre()
    
    Application.ScreenUpdating = False
    
    'Recopie vers feuille 1
    Sheets("SYNTHESE").Select
    Range("A1").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="<>"
    
    Range("A1").Select
    ActiveCell.Offset(1, 0).Select
   
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("A").Select
    Range("A2").Select
    ActiveSheet.Paste
    Range("A1").Select
    
    Application.ScreenUpdating = False
    
    End Sub

ca ne trie pas...

classeur exemple en pj
 

Pièces jointes

  • Classeurtest_filtre.xls
    30.5 KB · Affichages: 66
  • Classeurtest_filtre.xls
    30.5 KB · Affichages: 61
  • Classeurtest_filtre.xls
    30.5 KB · Affichages: 65
Dernière édition:

JHA

XLDnaute Barbatruc
Re : filtrer automatiquement les données : résultat sur une autre feuille

Bonjour,

un essai sans macro avec un filtre avance en feuille A


JHA
 

Pièces jointes

  • Classeurtest_filtre.xls
    41 KB · Affichages: 70
  • Classeurtest_filtre.xls
    41 KB · Affichages: 70
  • Classeurtest_filtre.xls
    41 KB · Affichages: 72

Efgé

XLDnaute Barbatruc
Re : filtrer automatiquement les données : résultat sur une autre feuille

Bonjour lennynero256, JHA,
Une proposition par macro:
VB:
Sub CopierAvecFiltre()
Dim Plg, F As Worksheet
Plg = Sheets("SYNTHESE_ANNUELLE").UsedRange.Value
For i = LBound(Plg, 2) To UBound(Plg, 2)
    On Error Resume Next
    Set F = Sheets(Plg(1, i))
    On Error GoTo 0
    If F Is Nothing Then Sheets.Add(After:=Sheets(Sheets.Count)).Name = Plg(1, i)
    With Sheets(Plg(1, i))
        .Cells.ClearContents
        .Cells(1, 1).Resize(UBound(Plg, 1), UBound(Plg, 2)) = Plg
        .UsedRange.Sort Key1:=.Cells(1, i), Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
    End With
Next i
End Sub
Cordialement
 

Pièces jointes

  • Classeurtest_filtre(2).xls
    25 KB · Affichages: 61

Efgé

XLDnaute Barbatruc
Re : filtrer automatiquement les données : résultat sur une autre feuille

Re
Un oubli dans le précédent code:
VB:
 Set F = Nothing
+ Maintient des feuilles dans l'ordre des colonnes en cas d'ajout partiel de feuilles
+ Message à la fin du traitement

VB:
Sub CopierAvecFiltre()
Dim Plg, F As Worksheet
Application.ScreenUpdating = False
Plg = Sheets("SYNTHESE_ANNUELLE").UsedRange.Value
For i = LBound(Plg, 2) To UBound(Plg, 2)
    On Error Resume Next
    Set F = Sheets(Plg(1, i))
    On Error GoTo 0
    If F Is Nothing Then Sheets.Add(After:=Sheets(i)).Name = Plg(1, i)
    With Sheets(Plg(1, i))
        .Cells.ClearContents
        .Cells(1, 1).Resize(UBound(Plg, 1), UBound(Plg, 2)) = Plg
        .UsedRange.Sort Key1:=.Cells(1, i), Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
    End With
    Set F = Nothing
Next i
Sheets("SYNTHESE_ANNUELLE").Activate
Application.ScreenUpdating = True
MsgBox "Export terminé"
End Sub
Cordialement
 

lennynero256

XLDnaute Junior
Re : filtrer automatiquement les données : résultat sur une autre feuille

Bonjour,

merci beaucoup Efgé pour ce code très efficace ! Néanmoins sur la version définitive du fichier j'ai un petit bug, "erreur définie par l'application ou par l'objet" sur cette partie :

Code:
Sheets.Add(After:=Sheets(Sheets.Count)).Name = Plg(1, i)

Pourrais tu stp si possible commenter un peu ton code ? Je suis débutant en vba, et j'aime apprendre et comprendre !

Encore merci.

Je joins le fichier de travail en pj
 

Pièces jointes

  • stats_2012_V2_121211.xls
    180 KB · Affichages: 85

Efgé

XLDnaute Barbatruc
Re : filtrer automatiquement les données : résultat sur une autre feuille

Bonjour lennynero256, JHA, le fil, le forum,
Nous nous confrontons à un problème qui deviens réccurent :rolleyes: : Le premier fichier exemple ne correspond pas, mais pas du tout, au fichier dit "de travail". Pourquoi ne pas avoir fourni ce dernier (le fichier de travail) en premier lieu (en exemple)?
Maintenant je ne comprend plus ce que tu veux....
D'ou viens l'onglet nommé "e" ?
Faut il reprendre et trier toutes les colonnes (de A à AO) ?
Faut il garder la mise en forme de l'en tête (sur deux lignes) ?
Faut il remetre, sur les nouvelles feuilles, les en têtes en ligne 10 / 11 ou doit on les mettre en lignes 1 / 2 ?
Il y a des en têtes qui se répettent (-26/EVA par exemple). Comment les gérer ?

Essai de faire un classeur de travail avec plus d'indications.

A te re lire
Cordialement
 

Efgé

XLDnaute Barbatruc
Re : filtrer automatiquement les données : résultat sur une autre feuille

Re
Une version adaptée comme suit :
Prise en compte des colonnes "orange" de A à G
Création des feuilles avec l'intitulé de la ligne 11
Tri de chaque feuille sur la colonne idoine
Le code est commenté

Cordialement
 

Pièces jointes

  • stats_2012_V2_121211(2).xls
    52 KB · Affichages: 72
Dernière édition:

lennynero256

XLDnaute Junior
Re : [RESOLU] filtrer automatiquement les données : résultat sur autre feuille

Bonsoir Efgé,

désolé pour ma réponse tardive (absent aujourd'hui) et un grand merci pour ton travail. Je n'avais pas placé le fichier de travail dès le départ car je ne voulais pas faire faire mon travail... Je pensais qu'une correction de mon code de départ ou quelques conseils suffiraient...

Mais quand je vois le code de ta macro (merci pour tes commentaires), je me rends compte que j'aurais pu essayer pendant longtemps. Je suis débutant en VBA, alors voir une macro comme la tienne me rend très humble et conscient du travail qui m'attend !

Le résultat obtenu correspond parfaitement à ce que je cherchais

Encore merci, cordialement,

Lenny
 

lennynero256

XLDnaute Junior
Re : [RESOLU] filtrer automatiquement les données : résultat sur autre feuille

bonjour !

j'ai un souci avec une (super) macro réalisée par Efgé (encore merci à lui) mais je n'arrive pas à trouver une solution pour adapter le code existant .

voici la macro :
Code:
Sub CopierAvecFiltre()
Dim i&, Plg, F As Worksheet
Application.ScreenUpdating = False
'On récupère les données dans un tableau en mémoire (gain de temps)
'de la ligne cellule ligne 3 colonne 1
'à la cellule dernière ligne remplie de la colonne 1 décalée de 40 colonnes
With Sheets("SYNTHESE_ANNUELLE")
    Plg = .Range(.Cells(3, 1), .Cells(3, 1).End(xlDown).Offset(0, 40)).Value
End With
'Pour les colonnes de 1 à 7
For i = 1 To 7
    'Si il y a une erreur on saute la ligne
    On Error Resume Next
    'on dit que f est égal à la feuille qui porte le nom de la cellule
    'ligne 2 de notre tableau mémoire colonne i
    'Si la feuille n'éxiste pas on a une erreur
    Set F = Sheets(Plg(2, i))
    'Si il y a une erreur on l'annule
    On Error GoTo 0
    'Si F n'est égal à rien, donc si la feuille n'éxiste pas
    'On la crée
    If F Is Nothing Then Sheets.Add(After:=Sheets(i)).Name = Plg(2, i)
    'Avec la feuille
    With Sheets(Plg(2, i))
        'on supprime toute les données
        .Cells.ClearContents
        'On colle le tableau mémoire
        .Cells(1, 1).Resize(UBound(Plg, 1), UBound(Plg, 2)) = Plg
        'On tri le tableau sur la colonne i (Voir resize dans l'aide)
        .UsedRange.Offset(2, 0).Resize(.UsedRange.Rows.Count - 2, .UsedRange.Columns.Count).Sort _
        Key1:=.Cells(2, i), Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
        'Mise au format % des colonnes Z à AM
       .Range(.Cells(3, 26), .Cells(.UsedRange.Rows.Count, 40)).NumberFormat = "0%"
        'On ajuste toutes les colonnes
        .Columns.AutoFit
    'On supprime la premiere ligne du tableau
         Range("A1:AO1").Select
        Selection.Delete Shift:=xlUp
        Range("A1").Select
    'Fin de l'utilisation de la feuille
    End With
    'on dit que F n'est rien (préparation du prochain passage)
    Set F = Nothing
'Prochaibne colonne a traiter
Next i
'Activation de la feuille SYNTHESE_ANNUELLE (pour faire beau
Sheets("SYNTHESE_ANNUELLE").Activate
Application.ScreenUpdating = True
'Boite de message de fin de traitement (si non, pour peu de données,on peux penser quer rien ne s'est passé :) )
MsgBox "Export terminé"
End Sub

les lignes qui semblent poaser problème sont celles-ci :

Code:
.UsedRange.Offset(2, 0).Resize(.UsedRange.Rows.Count - 2, .UsedRange.Columns.Count).Sort _
        Key1:=.Cells(2, i), Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom

je joins le fichier, il suffit de cliquer sur le bouton "actualiser les onglets.

Par avance merci pour vos conseils,

Lenny
 

Pièces jointes

  • stats_web.xls
    232 KB · Affichages: 56
  • stats_web.xls
    232 KB · Affichages: 57
  • stats_web.xls
    232 KB · Affichages: 55

Efgé

XLDnaute Barbatruc
Re : [RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

Bonjour lennynero256,
Supprime le -2 dans
Code:
.UsedRange.Offset(2, 0).Resize(.UsedRange.Rows.Count - 2, .UsedRange.Columns.Count).Sort _
Quelle étrange idée ai je eu là :eek:
Parcantre tu auras des problèmes sur la suppression de la ligne 1 avec le code que tu as rajouté.
Mieux vaut ne pas la copier dès le début

Cordialement
 

Pièces jointes

  • stats_web(2).xls
    110 KB · Affichages: 59

lennynero256

XLDnaute Junior
Re : [RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

Bonjour Efgé,

j'ai viré mon code pour la suppression de la 1ere ligne, appliqué ton correctif mais ça me provoque plusieurs erreurs. je te joins le fichier tel quel.

Pour info j'avais également modifié ici :

Code:
Plg = .Range(.Cells([B]3[/B], 1), .Cells([B]3[/B], 1).End(xlDown).Offset(0, 40)).Value
 

Pièces jointes

  • stats_web.xls
    178.5 KB · Affichages: 50
  • stats_web.xls
    178.5 KB · Affichages: 55
  • stats_web.xls
    178.5 KB · Affichages: 50

Efgé

XLDnaute Barbatruc
Re : [RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

Re
Je commence à ne plus comprendre ce qu'il faut faire....
Une nouvelle proposition, mais tes macros de tri m'inquiètes. Elles font référence à la plage A11 : AO492, alors que cette plage n'est pas prise en compte dans l'exemple d'exportation de tableau....
Cordialement
 

Pièces jointes

  • stats_web(3).xls
    229 KB · Affichages: 68

lennynero256

XLDnaute Junior
Re : [RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

Re,

merci Efgé, ça fonctionne.
Pour t'expliquer rapidement : l'onglet synthese_annuelle de ce classeur reçoit des données synthétiques en provenance d'autres classeurs (1 ligne par classeur). Ta macro de tri et la création des onglets qui en résulte, va me permettre de créer des graphiques croisés dynamiques par onglet, l'objectif étant qu'une mise à jour dans l'onglet synthese_annuelle (par le biais de liaisons avec les fichiers sources) entraine a mise à jour des onglets créés par ta macro (en cliquant sur le bouton "actualiser les onglets) et donc des graphiques à venir.

Vois tu des problèmes potentiels dans ce travail ?

Concernant la plage A11 : A0492, ce sont des macros de test, ces plages ne sont plus d'actualité (mon tableau compte 492 lignes).

J'espère que j'ai été assez clair, en tous cas je te remercie de nouveau pour ton aide et je te souhaite un joyeux Noël.

Cordialement,

Lenny
 

Efgé

XLDnaute Barbatruc
Re : [RESOLU] filtrer automatiquement les données : résultat sur une autre feuille

Re
Si j'ai bien compris, la création des onglets est inutile, puisque tu peux créer plusieurs Graphiques Croisés Dynamique sur la même source :D.
Au besoin ton bouton "actualiser les onglets" peux se résumer à :
VB:
ActiveWorkbook.RefreshAll
Mais, si j'ai pu t'aider, j'en suis content :)

Bonne fêtes à toi et aux tiens.

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 902
Membres
101 834
dernier inscrit
Jeremy06510