VBA : appliquer plusieurs filtres avec des cases à cocher

Résolu
AnDao Messages postés 79 Statut Membre -  
AnDao Messages postés 79 Statut Membre -
Bonjour à tous,

J'ai sur excel une liste de codes postaux que je souhaite répartir par zone géographique, en appliquant un filtre complexe via une macro VBA.

En cochant la case "Beaujolais" par exemple, l'utilisateur pourra faire en sorte que seules les lignes contenant un code postal identifié comme beaujolais s'affiche. Pour cela pas de problème, ainsi que pour la remise en place de la liste complète une fois la case décochée.

Ce que je ne sais pas faire en revanche, c'est additionner les critères si deux cases sont cochées.

Admettons par exemple que notre liste soit composée de tous les codes postaux du rhône. Comment faire si l'utilisateur souhaite cocher les deux cases "beaujolais" et "grand lyon" par exemple ?

Voici le code que j'ai actuellement, pour une seule case à cocher qui filtre sur trois codes postaux à titre d'exemple :

Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then
ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9, Criteria1:=Array("69001", "69002", "69003"), Operator:=xlFilterValues
If CheckBox1.Value = False Then
ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9
End Sub

Voilà, donc l'idée c'est de créer une checkbox2 qui prendrait en compte le filtre déjà actif pour ajouter ses propres critères (disons par exemple le reste de la ville de Lyon : Array("69004", "69005", "69006, "69007", "69008", "69009")

Merci d'avance pour votre aide !

Cordialement

2 réponses

  1. AnDao Messages postés 79 Statut Membre 2
     
    Bonjour,

    Merci de ta réponse. Cependant, mon fichier n'existe pas encore, c'est une extraction de ma base de données que je ne ferai qu'après avoir validé deux trois précisions avec mes collègues.

    Mais dans un premier temps on peut envisager travailler sur une liste exhaustive des communes du Rhône avec codes postaux, que nous allons répartir par zones géographiques.

    Je peux cependant répondre à toutes questions si ma demande n'est pas assez claire :)
    0
    1. PlacageGranby Messages postés 402 Statut Membre 26
       
      Quelque chose comme

      Dim critere as string
      Dim filtre as boolean

      Private Sub CheckBox1_Click()

      Critere = ""
      Filtre = false
      If CheckBox1.Value = True Then
      Critere = critere & """69001"", ""69002"", ""69003"""
      Filtre = true
      end if

      If CheckBox2.Value = True Then
      Critere = critere & """69004"", ""69005"", ""69006"""
      Filtre = true
      end if

      if filtre = true then
      ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9, Criteria1:=Array(critere), Operator:=xlFilterValues
      else
      ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9
      end if
      End Sub

      Mettre idem dans le click du checkbox 2

      Peut-être quelques petites erreur ci et la, mais ca donne une ligne directrice générale.
      0
    2. AnDao Messages postés 79 Statut Membre 2
       
      Merci ! Juste quelques questions pour comprendre ce code...
      - Quelle est la valeur du & ? Elle ajoute des valeurs à celles déjà existantes dans la variable ?
      - Pourquoi y-a-t-il deux paires de guillemets autour des codes postaux que tu fais rentrer dans le critère ?

      Si je comprends ça je pense pouvoir me dépatouiller.

      Super aide en tout cas.
      0
    3. PlacageGranby Messages postés 402 Statut Membre 26
       
      à la base je crois que j'ai une erreur.
      Je crois que le critère se devra d'être une variable de type array et non pas un string.

      Pour ta question, & et un opérateur qui sert a concaténer des chaines de texte.
      0
    4. PlacageGranby Messages postés 402 Statut Membre 26
       
      Oh, c'est un peu moins simple que j'avais prévu, les vecteurs (arrays), ne se concatène pas comme une vulgaire chaine texte :)

      Il y a des fonction qui permet de jumeler des vecteurs, mais pour un vecteur à une seule dimension, le code suivant devrait fonctionner :

      Dim Filtre As Boolean
      Dim A As string
      Dim B As string
      Dim Critere() As String
      
      Private Sub CheckBox1_Click()
      A = "n'importe quoi "
      B = "n'importe quoi"
      
      Filtre = False
      
      If CheckBox1.Value = True Then
      A = "69001,69002,69003"
      Filtre = True
      End If
      
      If CheckBox2.Value = True Then
      B = "69004,69005,69006"
      Filtre = True
      End If
      
        
      If Filtre = True Then
      Critere = Split(A & "," & B, ",")
      ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9, Criteria1:=Critere, Operator:=xlFilterValues
      Else
      ActiveSheet.Range("$A$1:$L$100").AutoFilter Field:=9
      End If
      End Sub



      Les variable A et B sont initialisé avec "n'importe quoi". C'est qu'il faut les réinitialisé, et si on les initialise vide, alors une case sans code postal pourrait s'afficher. Donc on peut mettre n'importe quoi en autant que ca ne corresponde pas à une valeur de code postal possible.
      0
    5. AnDao Messages postés 79 Statut Membre 2
       
      Je suis content, je comprends tout :p

      Un seul petit souci dans ce code : CheckBox1 et CheckBox2 modifient la même variable booléenne, Filtre. En se contentant d'appliquer ce code à mes deux checkboxes, l'intégralité du code s'exécute à la première case cochée, et Filtre reste True tant qu'elle l'est.

      Cocher la seconde case ne produit alors plus d'effet.

      Je vais donc essayer de créer une troisième case qui appliquera le filtre en fonction des deux premières... j'ai bien dit je vais essayer lol

      A suivre...
      0