Ajout d'un choix dans un filtre

Résolu
Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention   -  
Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Dans un filtre automatisé, est-il possible de remplacer la valeur des critères par un choix d'une liste déroulante ou par la valeur d'une cellule préalablement remplie pour chaque critère.
J'ai cherché en vain des exemples, mais sans doute mal cherché !
J'espère être clair, merci pour votre indulgence pour un débutant
Selection.AutoFilter
    ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
         Criteria1:=">=01/01/2021", Operator:=xlAnd, _
         Criteria2:="<=08/01/2021"
    ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
        Criteria1:="Charge"
    ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
        Criteria1:="Electricité"
    Range("I7002").Select

Merci pour votre aide

Configuration: Windows / Chrome 87.0.4280.88

7 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, le code que tu montres fonctionne-t'il?
    si oui, veux-tu remplacer, par exemple, "Electricité" par le contenu d'une cellule?
    si oui, tu peux faire, par exemple:
    Criteria1:= ActiveSheet.[z123]
    0
  2. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci pour ton aide,
    Je suis débutant, je pourrais effectivement rentrer les critères dans 4 cellules différentes avant de lancer ma macro qui fonctionne bien .
    Dans ta proposition si je comprend bien je dois remplacer :
    Criteria1:="Electricité" par Criteria1:= ActiveSheet.[z123]
    Désolé mais ActiveSheet.[z123] correspond à quelle cellule ?
    En fait je souhaite pouvoir à chaque fois que je lance ma macro pouvoir changer les critères, soit en alimentant avant la macro les 4 cellules correspondantes aux 4 critères, ou mieux en incorporant 4 boîtes de dialogue avec liste déroulante permettant de sélectionner chaque critères...
    J'espère être clair !
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu n'as pas répondu à ma première question.
      ActiveSheet.[z123]
      , c'est la cellule en colonne z et en ligne 123 de la feuille "active".
      il est préférable d'éviter les select et activate.
      et donc, par exemple, d'écrire
      Sheets("Compta").[z123]


      tu pourras ensuite passer aux boites de dialogue.
      0
  3. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Ci-joint ma macro intégrale :

    Sub Tri_date_categ_souscateg()
    '
    ' Tri_date_categ_souscateg Macro
        
        Sheets("Compta").Select
        ActiveSheet.Unprotect
        Columns("H:L").Select
        Selection.EntireColumn.Hidden = False
        Range("A3").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
             Criteria1:=">=01/01/2021", Operator:=xlAnd, _
             Criteria2:="<=08/01/2021"
        ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
            Criteria1:="Charge"
        ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
            Criteria1:="Electricité"
        Range("I7002").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
        Range("K7002").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
        Range("A7003").Select
        choix = MsgBox("Confirmer la suppression ?", 36, "Confirmation")
            'Si l'utilisateur a cliqué sur le bouton Oui
        If choix = vbYes Then
            'MsgBox "Vous avez cliqué sur Oui !", 64
        End If
        Selection.AutoFilter
        Range("I:I,K:K").Select
        Range("K1").Activate
        Selection.EntireColumn.Hidden = True
        Sheets("Compta").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        Range("A3").Select
    
    End Sub


    EDIT : Ajout des balises de code (la coloration syntaxique).
    Explications disponibles ici : ICI

    Merci d'y penser dans tes prochains messages.
    0
  4. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Re Bonjour,
    Je suis bien un débutant, donc je ne suis pas sûr de comprendre toutes tes remarques.
    La macro que j'ai posté, ce n'est bien sûr pas moi qui l'ai écrite, je l'ai faite à l'aide de l'enregistreur et j'ai ajouté une MsgBox que j'ai trouvé dans d'autres exemples.
    J'ai créé mon tableau avec 11 colonnes dont 4 se référent à une liste de choix.
    Je souhaite donc si c'est possible lorsque je lance ma macro que chacun de mes 4 critères :

    - 2 critères dates du ... au ... sur ma 1ère colonne
    - 1 critères pour les catégories (charges ...)
    - 1 critère pour les sous-catégories ( électricité ...)

    soit alimenté à partir d'une liste déroulante, correspondant à mes listes de choix, dans une boîte de dialogue.
    Est-ce que j'ai répondu à ta question ?
    PS : j'ai cherché pour la coloration syntaxique, mais non trouvé, j'ai vraiment bcp de choses à apprendre !!!
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je te demande si la macro fonctionne sans erreur.
      as-tu lu les explications concernant la coloration syntaxique?
      0
      1. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oui ma macro fonctionne parfaitement telle que je l'ai enregistrer avec les critères figés...
        J'ai regardé la coloration syntaxique, et après avoir sélectionné Basic avec la flèche, j'ai copier coller mon code, est-ce bien cela §

        Sub Tri_date_categ_souscateg()
        '
        ' Tri_date_categ_souscateg Macro
            
            Sheets("Compta").Select
            ActiveSheet.Unprotect
            Columns("H:L").Select
            Selection.EntireColumn.Hidden = False
            Range("A3").Select
            Selection.AutoFilter
            ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
                 Criteria1:=">=01/01/2021", Operator:=xlAnd, _
                 Criteria2:="<=08/01/2021"
            ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
                Criteria1:=Range("O6")
            ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
                Criteria1:=Range("O7")
            Range("I7002").Select
            ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
            Range("K7002").Select
            ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
            Range("A7003").Select
            choix = MsgBox("Confirmer la suppression ?", 36, "Confirmation")
                'Si l'utilisateur a cliqué sur le bouton Oui
            If choix = vbYes Then
                'MsgBox "Vous avez cliqué sur Oui !", 64
            End If
            Selection.AutoFilter
            Range("I:I,K:K").Select
            Range("K1").Activate
            Selection.EntireColumn.Hidden = True
            Sheets("Compta").Select
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
            Range("A3").Select
        
        End Sub
        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
         
        très bien.
        as-tu essayé en utilisant le contenu d'une cellule?
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Je viens de relancer la macro en modifiant les critères de dates et je constate que le résultat n'est pas celui escompté. Les >= et <= ne semblent pas pris en compte !
    Par contre j'ai modifié les 2 autres critères en utilisant la valeur de 2 cellules (O6 et O7) comme sur la dernière version de ma macro, ça fonctionne
    0
  7. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Je viens de lancer le filtre identique à ma macro, les résultats sont corrects, mais si je passe par ma macro enregistrée avec les mêmes critères j'ai un résultat erroné pour les critères de dates !
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      tu n'as pas montré comment tu avais modifié la macro pour les dates, ni ce que tu as mis dans les cellules correspondantes.
      0
  8. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
     
    Je n'ai pas modifié pour les dates, je ne sais pas faire, j'ai modifié les 2 autres critères pour qu'il se réfère à une cellule.
    Si j'exécute un filtre dans le tableau sur 2 dates du ... au ... avec l'enregistreur de macro, j'ai un résultat correct, mais si je lance la macro enregistrée donc avec les mêmes critères de date, je n'ai pas un bon résultat ?
    Ci-joint mon fichier : grosfi.ch/PEGeiYmKvGP
    Voila ma macro enregistrée :

    Sub Tri_date_categ_souscateg()
    '
    ' Tri_date_categ_souscateg Macro
        
        Sheets("Compta").Select
        ActiveSheet.Unprotect
        Columns("H:L").Select
        Selection.EntireColumn.Hidden = False
        Range("A3").Select
        Selection.AutoFilter
        ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
             Criteria1:=">=01/01/2021", Operator:=xlAnd, _
             Criteria2:="<=08/01/2021"
        'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
            Criteria1:="Charge"
        ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
            Criteria1:=Range("O6")
        'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
            Criteria1:="Electricité"
        ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
            Criteria1:=Range("O7")
        Range("I7002").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
        Range("K7002").Select
        ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
        Range("A7003").Select
        choix = MsgBox("Confirmer la suppression ?", 36, "Confirmation")
            'Si l'utilisateur a cliqué sur le bouton Oui
        If choix = vbYes Then
            'MsgBox "Vous avez cliqué sur Oui !", 64
        End If
        Selection.AutoFilter
        Range("I:I,K:K").Select
        Range("K1").Activate
        Selection.EntireColumn.Hidden = True
        Sheets("Compta").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        Range("A3").Select
    
    End Sub
    
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que le soucis, c'est que la macro travaille avec le format de date en anglais, et, donc, 08/01/2021, c'est le premier aout.
      je vais chercher une solution.
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      je pense que ceci fonctionne:
      ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
               Criteria1:=">=" + CStr(CLng(Range("O4"))), Operator:=xlAnd, _
               Criteria2:="<=" + CStr(CLng(Range("O5")))
      0
    3. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Sinon j'ai trouvé dans mes recherches qq chose pour les dates et j'ai intégré ce que je comprend et qui m'intéresse, la macro se déroule normalement, mais tjs le même problème pour les dates, je pense aussi que c'est dû au format de date.
      Et justement dans le code récupéré il me semble qu'il y a une correction de format et une combox, mais je ne comprend pas la syntaxe, j'ai essayé de l'intégrer dans ma macro mais j'ai des erreurs que je ne sais pas corriger ...
      Je joins la nouvelle macro
      Merci pour ton aide

      Sub Tri_date_categ_souscateg()
      '
      ' Tri_date_categ_souscateg Macro
          
          Sheets("Compta").Select
          ActiveSheet.Unprotect
          Columns("H:L").Select
          Selection.EntireColumn.Hidden = False
          Range("A3").Select
          Selection.AutoFilter
          
          'ActiveSheet.Range("$A$1").AutoFilter Field:=2, Criteria1:= _
          ">=" & Format(CDate(Me.ComboBox1), "mm/dd/yyyy"), Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Me.ComboBox2), "mm/dd/yyyy")
          
          ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
               Criteria1:=">=" & Range("O4"), Operator:=xlAnd, _
               Criteria2:="<=" & Range("O5")
          
          
          'ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
               Criteria1:=">=01/01/2021", Operator:=xlAnd, _
               Criteria2:="<=08/01/2021"
          'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
              Criteria1:="Charge"
              
          ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
              Criteria1:=Range("O6")
              
          'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
              Criteria1:="Electricité"
              
          ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
              Criteria1:=Range("O7")
          Range("I7002").Select
          ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
          Range("K7002").Select
          ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
          Range("A7003").Select
          choix = MsgBox("Confirmer la suppression ?", 36, "Confirmation")
              'Si l'utilisateur a cliqué sur le bouton Oui
          If choix = vbYes Then
              'MsgBox "Vous avez cliqué sur Oui !", 64
          End If
          Selection.AutoFilter
          Range("I:I,K:K").Select
          Range("K1").Activate
          Selection.EntireColumn.Hidden = True
          Sheets("Compta").Select
          ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
          Range("A3").Select
      
      End Sub
      
      0
    4. Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention   > Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
       
      Super c'est ok pour les dates, le résultat est correct. (Le format anglais ça vient de moi ?)
      Pour le critère "charge", ça fonctionne aussi, j'ai ajouté une liste déroulante dans la cellule "O6" pour le choix avec le menu Données/Validation des données, celle la même qui sert à l'alimentation du tableau.
      Par contre pour le critère Electricité (cellule "O7"), j'ai un problème, le choix est induit par celui de la cellule "O6".
      Dans mon tableau j'ai utilisé la fonction INDIRECTE dans la validation des données, je ne vois pas comment préciser cette condition dans ma macro !
      C'est peut-être là qu'il faut utiliser une boîte de dialogue !

      Sub Tri_date_categ_souscateg()
      '
      ' Tri_date_categ_souscateg Macro
          
          Sheets("Compta").Select
          ActiveSheet.Unprotect
          Columns("H:L").Select
          Selection.EntireColumn.Hidden = False
          Range("A3").Select
          Selection.AutoFilter
          
          'ActiveSheet.Range("$A$1").AutoFilter Field:=2, Criteria1:= _
          ">=" & Format(CDate(Me.ComboBox1), "mm/dd/yyyy"), Operator:=xlAnd, Criteria2:="<=" & Format(CDate(Me.ComboBox2), "mm/dd/yyyy")
          
          ActiveSheet.Range("$A$3:$M$7000").AutoFilter Field:=1, _
               Criteria1:=">=" + CStr(CLng(Range("P4"))), Operator:=xlAnd, _
               Criteria2:="<=" + CStr(CLng(Range("P5")))
             
          'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
              Criteria1:="Charge"
              
          ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=5, _
              Criteria1:=Range("P6")
              
          'ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
              Criteria1:="Electricité"
              
          ActiveSheet.Range("$A$2:$M$7000").AutoFilter Field:=6, _
              Criteria1:=Range("P7")
          Range("I7003").Select
          ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
          Range("K7003").Select
          ActiveCell.FormulaR1C1 = "=SUBTOTAL(9,R[-6996]C:R[-1]C)"
          Range("A7003").Select
          choix = MsgBox("Confirmer la suppression ?", 36, "Confirmation")
              'Si l'utilisateur a cliqué sur le bouton Oui
          If choix = vbYes Then
              'MsgBox "Vous avez cliqué sur Oui !", 64
          End If
          Range("I7003").Select
          Selection.ClearContents
          Range("K7003").Select
          Selection.ClearContents
          Selection.AutoFilter
          Range("I:I,K:K").Select
          Range("K1").Activate
          Selection.EntireColumn.Hidden = True
          Sheets("Compta").Select
          ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
          Range("A3").Select
      
      End Sub
      
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ramon1 Messages postés 364 Date d'inscription   Statut Membre Dernière intervention  
       
      j'avais le même problème avec le format anglais.
      je pense que c'est plutôt un soucis avec l'interprétation des dates par "autofilter" en VBA. en utilisant
      clng
      , c'est le VBA qui interprète la date, et court-circuite ainsi "autofilter". je pense plutôt à un bug de microsoft.

      en ce qui concerne "électricité": si je vois bien, tu ne nous montres pas ce que tu as essayé.
      je ne comprends pas tes explications, ni pour "charge", ni pour "électricité.
      peut-être préférable de partager ton fichier, et d'expliquer.
      0