Filtre élaboré et colonnes triées

moustic54

XLDnaute Occasionnel
Bonjour à vous tous

Je commence un peu à appréhender les filtres élaborés mais je ne réussis pas à trier lors de l'affichage du résultat, par macro, l'une des colonnes : onglet : FE 1 - Colonne E avec tri ascendant.
Pas plus que je ne réussis à faire un double tri dans l'onglet FET UCE - Colonne E (avec tri de z à a) PUIS colonne F avec tri ascendant.

Je joins un fichier exemple
Si vous pouviez m'apporter votre aide. :confused:
 

Pièces jointes

  • filtre elabore.xlsm
    20.3 KB · Affichages: 28
  • filtre elabore.xlsm
    20.3 KB · Affichages: 34
  • filtre elabore.xlsm
    20.3 KB · Affichages: 42

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Bonjour

Le filtre élaboré étant assez souple, tu peux utiliser des colonnes entières sans passer par un resize.
Il n'est pas non plus nécessaire d'effacer la zone où seront extraites les données, Excel le fait automatiquement.

Pour le tri, qui doit être fait dans un second temps, tu utilises le tri habituel.

Code:
    With ActiveWorkbook.Worksheets("FET UCE")
    Sheets("Base").Columns("A:O").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=.Range("N1:Q2"), CopyToRange:=.Range("D8:P8"), _
        Unique:=False
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=.Range("E8"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Range("F8"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange .Cells(8, 5).CurrentRegion
        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.Apply
    End With
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Bonsoir Christ

Je suis pas un expert juste un novice dans ce domaine
Pourrais-tu m'expliquer en quoi consistent ces lignes de commandes, s'il te plait ?

.Sort.SetRange .Cells(8, 5).CurrentRegion
.Sort.Header = xlYes
.Sort.MatchCase = False
.Sort.Orientation = xlTopToBottom
.Sort.Apply​


Est-il possible de copier les tableaux obtenus grâce aux filtres dans de nouveaux classeurs soit un tableau par nouveau classeur ou selon le cas, les copier dans un nouveau classeur mais dans des onglets différents tout en conservant les MEC du fichier d'origine ?

Merci pour ton aide
 

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Bonjour

Mes journées actuelles ne me permettent pas de me connecter avant le soir.

.Sort.SetRange .Cells(8, 5).CurrentRegion : sélectionne toute la plage entourant E8 (currenrRegion c'est le même résultat que si tu te places sur cette cellule et que tu utilises CTRL *

.Sort.Header = xlYes : comme on ignore s'il ya des lignes, on part de la ligne d'en-tête et on le dit à Excel afin qu'elle ne soit pas triée parmi les lignes.
.Sort.MatchCase = False : on ne différencie par majuscules/minuscules
.Sort.Orientation = xlTopToBottom : tri vertical croissant
.Sort.Apply : exécution du tri

L'aide en ligne VBA et l'enregistreur de macro te donnent pas mal d'indications. Utilise-les.

L'extraction par filtre écrase les MFC. Même si on peut extraire dans un autre classeur, il est donc préférable de copier les valeurs extraites dans la plage contenant la MFC.

Je conseillerais un classeur avec des tableaux, au sens 2007-2013, avec juste l'en-tête et une ligne vide préformatée ce qui permettra la propagation des formats sans avoir à le faire par VBA. Mais il y aura donc une zone temporaire pour les extractions.
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Bonjour Chris

Aucun soucis.
Tes explications sont très claires et me permettront de réitérer l'expérience sous d'autres formes.

Je crois en revanche que je me suis mal exprimé.
Depuis le fichier Filtre élaboré, je voudrais copier dans un nouveau classeur (ex : toto) le tableau réalisé grâce aux filtres.
Par exemple copier sur un onglet de toto la zone D5 à T5 jusqu'à la dernière ligne renseignée forcément variable de la feuille FE 1 du fichier Filtre élaboré
ou autre cas, copier dans un fichier titi sur le 1er onglet la zone D5 à T5 de FE 1, sur un 2eme zone D5 à Q5 de FET UCE tout en prévoyant le cas où aucune donnée ne serait présente sur la ligne des titres D8 à Q8 alors inscrire sur le 2eme onglet "NO PROBLEMO".

Je ne sais pas si tu vas me comprendre :confused:
 

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Re

Il est facile de vérifier si la cellule E9 est ou non vide pour ton NO PROBLEMO
dans le cas contraire, avec .Cells(8, 5).CurrentRegion tu peux copier le résultat du filtre, vers la cellule ad hoc de ton classeur 2.

Si tu ne veux pas du titre, il est facile de déduire la plage à copier de celle obtenue avec CurrentRegion
 
Dernière édition:

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Chris,

Cela te semble si simple.
J'ai essayé de faire ce que j'aurai voulu obtenir mais il y a trop de bug dans le code :eek:
Pourrais-tu regarder, s'il te plait ?
 

Pièces jointes

  • filtre elabore v2.xlsm
    23.4 KB · Affichages: 32
Dernière édition:

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Re

Je t'ai donné des indications et un code au #2 mais tu n'en as pas tenu compte.

Il y a des incohérences entre ton exemple, tes explications, ton code.

  • La zone de critère dans ton code est S1:S2 qui ne correspond à rien dans l'exemple
  • Le tri que je t'ai donné, correspondait à ta demande sur l'onglet FET UCE mais tu l'appliques à FE 1
  • Le champ RENSEIGNT n'existant pas dans la base ne peut être extrait dans FET UCE
  • le champ Direction n'existe pas et ne peut servir de critère : c'est SERV
  • Tu parles d'un onglet Toto mais dans ton code, c'est le nom du classeur
  • Tu parles de MEC : j'avais lu MFC. Je ne comprends pas de quoi tu parles, d'autant que tu copies dans un classeur vierge
  • Tu veux copier D5 à T5 alors que l'extraction s'arrête en colonne M
  • Je ne comprends pas ta logique du NO PROBLEMO : que le filtre extrait ou non des lignes, la ligne de titres existera toujours.
Bref un peu plus de rigueur serait bienvenue.

Apprendre le VBA, c'est d'abord apprendre à bien analyser et mettre à plat le problème...

Voici le code du #2 complété : à toi de voir comment adapter pour l'onglet FE 1
Code:
Sub test()
Dim NDF As String, rep As String
Dim Acopier As String

Application.ScreenUpdating = False
    With ActiveWorkbook.Worksheets("FET UCE")
    Sheets("Base").Columns("A:O").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=.Range("N1:Q2"), CopyToRange:=.Range("D8:P8"), _
        Unique:=False
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=.Range("E8"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=.Range("F8"), _
            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SetRange .Cells(8, 5).CurrentRegion
        .Sort.Header = xlYes
        .Sort.MatchCase = False
        .Sort.Orientation = xlTopToBottom
        .Sort.Apply
        If .Range("E9") <> "" Then
            .Cells(8, 5).CurrentRegion.Copy
        Else
            Acopier = "NO PROBLEMO"
        End If
    End With

rep = ActiveWorkbook.Path & "\TEST\"
If Dir(rep, vbDirectory) = "" Then MkDir rep
NDF = rep & "toto.xlsx"
If Dir(NDF) <> "" Then Kill (NDF)

Workbooks.Add
If Acopier = "" Then
    ActiveSheet.Paste
Else
    Cells(1, 1).Value = Acopier
End If

ActiveSheet.Name = "TEST 1"
ActiveWorkbook.SaveAs Filename:=NDF
Application.ScreenUpdating = True

End Sub
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Bonjour Chris,

Contrairement à ce que tu écris, j'ai bien pris en compte tes précieuses indications et observations.
Les incohérences viennent du fait que je travaille sur 2 fichiers différents et qu'il m'arrive de me tromper en passant de l'un à l'autre d'où ton impression d'incohérence.


Tu écris : "• Je ne comprends pas ta logique du NO PROBLEMO : que le filtre extrait ou non des lignes, la ligne de titres existera toujours. "

C'est vrai mais j'ai pensé qu'en passant par la notion CurrentRegion, on pourrait peut-être passer outre.

Je m'explique :
- Si je mets un titre sur 2 lignes au tableau figurant sur l'onglet FET UCE (d4 à q7)
- le tableau étant placé quant à lui en D8 à Q8 jusqu'à la dernière ligne renseignée

Ne peut-on pas avoir un code du type (je l'écris en partie en français puisque comme tu l'auras compris je ne maîtrise pas le VBA) :(

If .Range("E9") <> "" Then
.Cells(4, 5).CurrentRegion.Copy --> LIGNES DU TITRE
et

.Cells(8, 5).CurrentRegion.Copy --> TABLEAU AVEC ENTETES
Else
.Cells(4, 5).CurrentRegion.Copy --> LIGNES DU TITRE
et

Acopier = "NO PROBLEMO"
End If
End With

L'intérêt est double : le titre du tableau permet de savoir de quoi il retourne + en l'absence de lignes, pas de copie de la ligne des entêtes de colonnes.

L'analyse du problème et la solution envisagée te paraissent-elles réalisables en code VBA ?
 
Dernière édition:

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Bonjour

...
- Si je mets un titre sur 2 lignes au tableau figurant sur l'onglet FET UCE (d4 à q7)
- le tableau étant placé quant à lui en D8 à Q8 jusqu'à la dernière ligne renseignée

Ne peut-on pas avoir un code du type (je l'écris en partie en français puisque comme tu l'auras compris je ne maîtrise pas le VBA) :(

If .Range("E9") <> "" Then
.Cells(4, 5).CurrentRegion.Copy --> LIGNES DU TITRE
et

.Cells(8, 5).CurrentRegion.Copy --> TABLEAU AVEC ENTETES
Else
.Cells(4, 5).CurrentRegion.Copy --> LIGNES DU TITRE
et

Acopier = "NO PROBLEMO"
End If
End With
D'un point de vue purement logique, tu veux copier tes lignes indiquant le tri dans tous les cas

Donc
Code:
.Cells(4, 5).CurrentRegion.Copy
doit être en dehors du IF et placé avant

La seconde copie (celle placée dans le IF) doit donc se placer en ligne 5 par exemple de la feuille cible
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

C'est vrai, puisque dans tous les cas, .Cells(4, 5) sera copié. :eek:
Une fois que tu le dis, cela parait si évident.
Je suis envieux et espère pouvoir avoir un jour, Chris, ton degré d'analyse.

J'aurai une autre question portant cette fois sur la copie dans un nouveau classeur non pas d'un seul onglet mais de 4 ou plus.

Je vais reprendre l'ensemble des critères pour les X extractions sur le fichier "Origine", ce qui ne pose pas de problème en soi mais je vais devoir totalement modifier la méthode de copie (noms des onglets, ajouter un onglet puisque par défaut 3 feuilles par fichier, indiquer que la feuil1 va réceptionner la copie de de tel tableau, etc.) :(

Est ce ainsi que je dois procéder ?
 

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Re

Il faudra une variable pour le classeur source et une pour le classeur cible afin de naviguer entre les deux ou les citer dans les copies.

Je conseille d'ajouter des onglets dès l'ouverture du nouveau classeur.

Il suffira ensuite d'utiliser pour le classeur cible l'index de feuille, worksheets(1) puis worksheets(2) etc, ce qui évite de gérer les noms qu'Excel leur donne puisque tu les renommes ensuite.

Il existe un paramètre destination de la commande Copy, qui évite de naviguer d'un classeur à l'autre avec des activate et select : il faut juste préciser le détail classeur.feuille.plage source et classeur.feuille.plage cible.
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Waouh Chris, çà fait peur.:(
Tu es dans ton élément mais pour moi c que tu as écrit, c'est de l'hébreu :confused: :confused:
Je suis vraiment novice et avance pas à pas :eek:
Mais je veux progresser et surtout comprendre aussi si cela ne t'ennuie pas je te proposerai un essai de codes
et te demanderai conseils dont j'ai bien besoin.
 

moustic54

XLDnaute Occasionnel
Re : Filtre élaboré et colonnes triées

Bonjour Chris,

AU SECOURS !!! :( :( :(

J'ai essayé de modifier le code de façon à faire apparaitre dans le nouveau classeur "toto.xlsx" à la fois le titre du tableau
.Cells(5, 5).CurrentRegion.Copy
ET le résultat du filtre élaboré
.Cells(8, 5).CurrentRegion.Copy
en laissant une ligne vide entre les 2

Le résultat obtenu dans toto.xlsx est : soit seul le titre est recopié soit seul le résultat du filtre :confused:
mais je ne réussis pas à recopier à la fois l'un et l'autre. :confused:


Code:
    Sub test()
 Dim NDF As String, rep As String
 Dim Acopier As String

 Application.ScreenUpdating = False
     With ActiveWorkbook.Worksheets("FET UCE")
     Sheets("Base").Columns("A:O").AdvancedFilter Action:=xlFilterCopy, _
         CriteriaRange:=.Range("N1:Q2"), CopyToRange:=.Range("D8:P8"), _
         Unique:=False
         .Sort.SortFields.Clear
         .Sort.SortFields.Add Key:=.Range("E8"), _
             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .Sort.SortFields.Add Key:=.Range("F8"), _
             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .Sort.SetRange .Cells(5, 5).CurrentRegion
         .Sort.SetRange .Cells(8, 5).CurrentRegion
         .Sort.Header = xlYes
         .Sort.MatchCase = False
         .Sort.Orientation = xlTopToBottom
         .Sort.Apply
         If .Range("E9") <> "" Then
             .Cells(8, 5).CurrentRegion.Copy
         Else
             Acopier = "NO PROBLEMO"
         End If
     End With

 rep = ActiveWorkbook.Path & "\TEST\"
 If Dir(rep, vbDirectory) = "" Then MkDir rep
 NDF = rep & "toto.xlsx"
 If Dir(NDF) <> "" Then Kill (NDF)

 Workbooks.Add
 If Acopier = "" Then
     ActiveSheet.Paste
 Else
     Cells(1, 1).Value = Acopier
 End If

 ActiveSheet.Name = "TEST 1"
 ActiveWorkbook.SaveAs Filename:=NDF
 Application.ScreenUpdating = True

 End Sub
 

chris

XLDnaute Barbatruc
Re : Filtre élaboré et colonnes triées

Bonjour

Dans ton code il n'y a qu'une copie. Par contre la ligne
Code:
.Sort.SetRange .Cells(5, 5).CurrentRegion
n'a pas de sens car elle définit comme zone à trier tes titres des lignes 4 et 5.

Dans la mesure où il y a n filtres puis copies, j'ai inversé la gestion du classeur cible et je t'ai mis en commentaires des indications pour gérer tes diverses opérations de filtre/copie
Code:
Sub test2()
 Dim NDF As String, rep As String
 Dim Wsource As Workbook, Wcible As Workbook

 Application.ScreenUpdating = False
    Set Wsource = ThisWorkbook
    
    'Gestion dossier et classeur
    rep = ThisWorkbook.Path & "\TEST\"
    If Dir(rep, vbDirectory) = "" Then MkDir rep
    NDF = rep & "toto.xlsx"
    If Dir(NDF) <> "" Then Kill (NDF)

    Workbooks.Add
    Set Wcible = ActiveWorkbook
    'Si nécessaire ajouter une feuille
    'Wcible.Sheets.Add
        
     
     'Filtre Base vers FET UCE
     With Wsource.Worksheets("FET UCE")
        Wsource.Sheets("Base").Columns("A:O").AdvancedFilter Action:=xlFilterCopy, _
         CriteriaRange:=.Range("N1:Q2"), CopyToRange:=.Range("D8:P8"), _
         Unique:=False
         .Sort.SortFields.Clear
         .Sort.SortFields.Add Key:=.Range("E8"), _
             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .Sort.SortFields.Add Key:=.Range("F8"), _
             SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
         .Sort.SetRange .Cells(8, 5).CurrentRegion
         .Sort.Header = xlYes
         .Sort.MatchCase = False
         .Sort.Orientation = xlTopToBottom
         .Sort.Apply
        
        
        'Copie FET UCE
        .Cells(4, 5).CurrentRegion.Copy Destination:=Wcible.Worksheets(1).Cells(1, 2)
        
         If .Range("E9") <> "" Then
             .Cells(8, 5).CurrentRegion.Copy Destination:=Wcible.Worksheets(1).Cells(4, 1)
         Else
             Wcible.Worksheets(1).Cells(4, 1) = "NO PROBLEMO"
         End If
     
     End With

    Wcible.Worksheets(1).Name = "TEST 1"
 
 'Placer ici les autres filtres et copies en changeant de feuille cible
 
 Wcible.SaveAs Filename:=NDF
 Application.ScreenUpdating = True

 End Sub
 

Discussions similaires

Réponses
15
Affichages
825

Statistiques des forums

Discussions
312 299
Messages
2 086 997
Membres
103 424
dernier inscrit
Kyuubi