VBA : appliquer plusieurs filtres avec des cases à cocher

Résolu/Fermé
AnDao Messages postés 71 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 17 mars 2015 - 5 nov. 2014 à 17:12
AnDao Messages postés 71 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 17 mars 2015 - 13 nov. 2014 à 15:33
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

PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
6 nov. 2014 à 14:23
Je crois qu'il serait opportun d'ajouter ton fichier, s'il ne contient pas d'informations confidentielles, pour que l'on puisse se faire une meilleur idée.

Tu peux le mettre en ligne via cjoint
https://www.commentcamarche.net/faq/29493-utiliser-cjoint-pour-heberger-des-fichiers
1
AnDao Messages postés 71 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 17 mars 2015 2
6 nov. 2014 à 16:24
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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
6 nov. 2014 à 17:52
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
AnDao Messages postés 71 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 17 mars 2015 2
6 nov. 2014 à 18:19
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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
6 nov. 2014 à 19:11
à 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
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 6/11/2014 à 20:40
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
AnDao Messages postés 71 Date d'inscription dimanche 6 janvier 2008 Statut Membre Dernière intervention 17 mars 2015 2
7 nov. 2014 à 12:47
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