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

moustic54

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

Re Chris

Tu es tel un poisson dans l'eau au milieu de tous ces codes qui restent pour moi des notions bien mystérieuses :eek:
Aussi merci pour les commentaires et indications en sus :)
C'est sympa pour le novice que je suis.
Je vais m'empresser de tester et de le compléter pour l'adapter à la copie des X onglets.

Toutefois tu écris

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

Quel aurait du être le code ci-dessous, si nous étions restés sur une seule copie (titre et tableau source) vers un nouveau classeur sur un unique onglet ? :confused:

J'ai ajouté la ligne .Cells(5, 5).CurrentRegion.Copy
pour la copie du titre
et supprimé
.Sort.SetRange .Cells(5, 5).CurrentRegion

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
       .Cells(5, 5).CurrentRegion.Copy
          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

Re

Copy met les informations dans le presse papiers mais c'est Paste qui colle dans la cible si on n'a pas utilisé le paramètre Destination pour la copie.

Il faut alors 2 copy et 2 paste si tu as 2 zones : donc là aussi plus simple à gérer si la gestion du classeur cible est déjà faite.

Sinon, en utilisant le paramètre Destination, on peut modifier ainsi
Code:
Sub test3()

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
        rep = ActiveWorkbook.Path & "\TEST\"
        If Dir(rep, vbDirectory) = "" Then MkDir rep
        NDF = rep & "toto.xlsx"
        If Dir(NDF) <> "" Then Kill (NDF)
        Workbooks.Add
        .Cells(5, 5).CurrentRegion.Copy Destination:=ActiveSheet.Cells(1, 2)
        If .Range("E9") <> "" Then
            .Cells(8, 5).CurrentRegion.Copy Destination:=ActiveSheet.Cells(5, 1)
        Else
            ActiveSheet.Cells(5, 1).Value = "NO PROBLEMO"
        End If
    End With
    ActiveSheet.Name = "TEST 1"
    ActiveWorkbook.SaveAs Filename:=NDF
    Application.ScreenUpdating = True
End Sub

Mais pour ma part je trouve le code de mon post précédent plus logique car la gestion du classeur cible dans une structure With liée au classeur source me dérange un peu même si cela fonctionne.
 
Dernière édition:

moustic54

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

Re,

Merci Chris pour tes explications toujours limpides.
Je ne peux toutefois m'empêcher de sourire lorsque tu écris :D

Il faut alors 2 copy et 2 paste si tu as 2 zones : donc là aussi plus simple à gérer si la gestion du classeur cible est déjà faite.​
Je peux t'assurer que ce qui te semble PLUS SIMPLE, ne l'est pas pour la plupart des quidams
en commençant par moi :eek:
Merci encore
 

moustic54

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

Bonjour Chris

Ce ne fut pas sans mal, de petites erreurs çà et là, mais je suis arrivé grâce à toi à faire un nouveau classeur reprenant les tableaux source. :)

Il me reste toutefois quelques scories à l'exemple du titre de mes tableaux source.
Sur 2 lignes le titre est constitué en 1ere ligne d'une écriture "en dure" et sur l'autre résulte d'une concaténation écriture + réf à l'une des cellules de l'onglet.
Dès lors, impossible de l'avoir correctement sur le nouveau classeur puisque la cellule réf. utilisée lors de la concaténation n'existe pas.
Existe-il un moyen d'y remédier du genre collage spécial format + valeur ? :confused::confused:

J'ai un autre souci.
J'ai mis en place un certain nombre de mises en forme conditionnelles dans les onglets origines qui font leur office lors de l'utilisation de mes filtres élaborés.
Mais là encore je les perds une fois la copie faite dans le nouveau classeur. Y a t il une solution sur ce point ? :confused:
 

moustic54

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

Bonjour Chris

Je me permets de revenir vers toi.
Je suis intervenu sur un post et cela m'a donné une idée pour solutionner mon problème de MFC malheureusement je ne parviens pas à "l'associer" au code existant. :( :(

Je m'explique.

Entre la partie "exécution" du filtre élaboré et la partie "copie vers un nouveau classeur" , je voudrais pouvoir y ajouter le code suivant qui agit sur l'onglet "BASE".
Les références ne sont pas les miennes, je les adapterais.
J'ai pu tester le code seul sur un tableau de plus de 600 lignes, cela fonctionne mais vraiment lentement.

Aussi peux-tu m'aider à l'intégrer au code déjà existant (Sub Test 2 ou Sub test 3) ? :confused: :confused:


Code:
Sub new_Click()
    Dim r As Range
    For Each r In Range("F2:F" & Range("F2").CurrentRegion.Rows.Count)
    
        If r.Offset(0, 25).Value = "" Then r.Offset(0, 25).FormulaR1C1 = _
        "=IF(AND(RC[-23]=""agence"",OR(RC[-25]=""inter"",RC[-25]=""t/s"",RC[-25]=""liens"",RC[-25]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 26).Value = "" Then r.Offset(0, 26).FormulaR1C1 = _
        "=IF(AND(RC[-24]=""agence"",OR(RC[-26]=""inter"",RC[-26]=""t/s"",RC[-26]=""liens"")),""wwww"","""")"
        If r.Offset(0, 27).Value = "" Then r.Offset(0, 27).FormulaR1C1 = _
        "=IF(AND(RC[-25]=""agence"",OR(RC[-27]=""inter"",RC[-27]=""t/s"",RC[-27]=""brun"",RC[-27]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 28).Value = "" Then r.Offset(0, 28).FormulaR1C1 = _
        "=IF(AND(RC[-26]=""agence"",OR(RC[-28]=""inter"",RC[-25]=""t/s"",RC[-25]=""brun"",RC[-25]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 29).Value = "" Then r.Offset(0, 29).FormulaR1C1 = _
        "=IF(AND(RC[-27]=""agence"",OR(RC[-29]=""brun"",RC[-25]=""liens"",RC[-25]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 30).Value = "" Then r.Offset(0, 30).FormulaR1C1 = _
        "=IF(AND(RC[-28]=""agence"",OR(RC[-30]=""brun"",RC[-25]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 31).Value = "" Then r.Offset(0, 31).FormulaR1C1 = _
        "=IF(AND(RC[-29]=""agence"",OR(RC[-31]=""brun"",RC[-31]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 32).Value = "" Then r.Offset(0, 32).FormulaR1C1 = _
        "=IF(AND(RC[-30]=""agence"",OR(RC[-32]=""inter"",RC[-32]=""t/s"",RC[-32]=""brun"",RC[-32]=""cdr"")),""wwww"","""")"
        If r.Offset(0, 33).Value = "" Then r.Offset(0, 33).FormulaR1C1 = _
        "=IF(AND(RC[-31]=""agence"",OR(RC[-33]=""brun"",RC[-33]=""cdr"")),""wwww"","""")"
   
    Next r
End Sub
 

chris

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

Bonjour

Je ne comprends pas ce que tu veux faire.

Si tu as besoin d'une MFC sur l'onglet base pourquoi ne pas la faire normalement ?

Petit rappel si tu mets ces données sous forme de tableau les MFC s'appliqueront automatiquement à toute les nouvelles lignes.
 

moustic54

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

Re,

J'ai des MFC qui fonctionnent parfaitement non pas sur l'onglet BASE mais sur les autres onglets, onglets utilisés pour les filtres élaborés. Les fameux onglets qui sont copiés vers un nouveau classeur.
C'est ce que nous avons obtenu grâce à ton aide.

Malheureusement lors de la copie (ou des copies de X onglets) vers le nouveau classeur, les MFC ne sont pas reprises et finis mes cellules "grisées". :( :(
Il faudrait pouvoir avoir dans le code : copier puis coller avec mise en forme.

Je me suis donc dit, qu'à défaut des MFC présents sur mes onglets, si je parvenais à reprendre le code écrit sur mon précèdent post à l'emplacement indiqué, ce serait certes un hersât, mais que j'obtiendrais malgré tout au final - même si cette partie de code, j'en ai conscience, agit sur l'onglet BASE et non sur les autres comme le font mes MFC - quelque chose que pourrait se rapprocher de l'objectif recherché. :eek:
 
Dernière édition:

Discussions similaires

Réponses
15
Affichages
955

Statistiques des forums

Discussions
312 836
Messages
2 092 647
Membres
105 476
dernier inscrit
hilt