Pb VBA: ComboBox activant 2filtres chacun sur 2colonnes ??

Résolu/Fermé
Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017 - Modifié le 26 avril 2017 à 15:22
Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017 - 27 avril 2017 à 14:46
Bonjour, bonjour !

Je rencontre le souci suivant dans l'écriture d'une macro:
ma feuille HOME contient uniquement 2 boutons : "Consult" et "Edit", et c'est le 1er qui me cause des pbs.
En cliquant sur "Consult", une Combobox me demandant 1 ou 2 choix (compagnie et/ou fournisseur) s'ouvre. L'utilisateur peut sélectionner une compagnie aérienne (suggérées dans une liste) ET un fournisseur (suggérés également), ou alors seulement l'un ou l'autre.

Voici le code de cette partie qui marche bien (si ce n'est que j'aimerais que la comboBox "refuse" les requetes qui ne sont pas suggérés dans mes listes, mais c'est secondaire pour l'instant):


Private Sub UserForm_Initialize()

' Fill the ComboBox

ComboBoxSupplier.List = Array("ALL Suppliers", "B/E Aerospace", "JAMCO America", "Recaro", "Stelia", "Thompson", "ZSF", "ZSUS")

ComboBoxAirline.List = Array("ALL A/L", "AAL", "AAR", "AZU", "CAL", "CPA", "CSC", "DAL", "DLH", "ETD", "ETH", "FIN", "FWI", "HVN", "MAS", "MAU", "QTR", "SIA", "TAM", "THA")

End Sub

Une fois le choix fait, le user valide avec le bouton "OK" de la ComboBox. Normalement sur la feuille "TOPICS", je dois avoir le résultat de ce filtre simultané et non pas l'un après l'autre. Les compagnies, correspondant à la colonne D; et les suppliers, à la colonne B. Et là je cale, j'ignore comment le formaliser. J'ai pensé à qlq chose du genre:


Sub ConsultOK ()
Unload Me
If ComboboxSupplier.Value = "THA"
Then call Macro1...
End If
Sans trop savoir écrire ma Macro1...
Je ne connaissais pas du tout l'AutoFilter ni l'AdvancedFilter; aussi j'ai travaillé sur des fichiers simples pour en comprendre le fonctionnement mais ce n'est pas mieux... Je n'arrive pas à faire en sorte que le second filtre par exemple ne se fasse pas sur le résultat du 1er filter, et ainsi perdre des données . Exemple type ci-dessous dont le résultat ne donne RIEN, le filtre se fait mais je n'ai plus que mes en-têtes...:


Sub filtre()
With Sheet1
.AutoFilterMode = False
With .Range("A1:B1")
.AutoFilter
.AutoFilter Field:=1, Criteria1:="léa"
.AutoFilter Field:=2, Criteria1:="eva"
End With
End With
End Sub

J'avais aussi pensé un opérateur de liaison style "Operator:=xlAnd' mais de ce que j'ai trouvé ça s'utilise quand on a 2 critères de filtre sur le meme champ, ce qui n'est pas mon cas.

Par avance, merci bcp de votre aide.

Dianex


1 réponse

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
26 avril 2017 à 20:11
Bonsoir Diane, bonsoir le forum,

Un petit exemple en pièce jointe (que tu aurais dû fournir toi-même d'ailleurs)...

https://www.cjoint.com/c/GDAskMOQCtR
1
Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017
Modifié le 27 avril 2017 à 11:13
Merci bcp ThauTheme, ton fichier-illustration est parfait, et cela fonctionne! Vraiment, MERCI !
Le site cjoint.com qu'on m'a effectivement déjà suggéré par le passé est bloqué à mon boulot... J'essaie d'expliquer au mieux mais je me doute que ce n'est pas toujours evident à comprendre.

Si tu as le temps de m'expliquer 2/3 choses de la macro, je suis preneuse:
1- tout d'abord je m'étonne que tu aies nommé 2 fois la meme macro Private Sub CommandButton1_Click() dans le code de la feuille HOME et celui du USERFORM. Je pensais cela impossible car macro en doublon ?

2- l'expression CURRENTREGION correspond-elle à toutes les cellules remplies contigues de A1 ici en l'occurrence ? Donc finalement cela englobe toutes les cellules remplies de la feuille TOPICS ? Et ce serait la meme chose que si tu avais mis T.Range("B1").CurrentRegion par exemple, ou meme C5 ? Et si des lignes/colonnes contigues sont ajoutées en cours de projet, elle seront intégrées à la CurrentRegion?

3- Enfin, j'ai rajouté ALL Suppliers et ALL A/L dans mes listes de valeurs. Un user peut par exemple vouloir sélectionner tel fournisseur avec toutes les A/L. Ci-dessous la modif de code que j'ai essayée, mais qui ne remonte aucune donnée filtrée:

Private Sub CommandButton1_Click() 'bouton "OK"
Dim T As Worksheet

Set T = Worksheets("TOPICS")
If T.FilterMode = True Then T.Range("A1").CurrentRegion.AutoFilter 'si l'onglet est filtré, supprime le filte

If Me.ComboBoxSupplier.Value = "ALL Suppliers" Then T.Range("A1").CurrentRegion.AutoFilter Field:=2
If Me.ComboBoxSupplier.Value <> "*Suppliers*" Then T.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:=Me.ComboBoxSupplier.Value

If Me.ComboBoxAirline.Value = "ALL A/L" Then T.Range("A1").CurrentRegion.AutoFilter Field:=3
If Me.ComboBoxAirline.Value <> "*A/L*" Then T.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=Me.ComboBoxAirline.Value

T.Select
Unload Me
End Sub


Une idée de ce qui ne va pas, stp ?

Merci bcp,
Diane
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017
Modifié le 27 avril 2017 à 12:09
Re,

Première question :
Par défaut un nouveau bouton s'appelle CommandButton1, 2 3, etc. Mais un CommandButton dans un onglet a son code complètement isolé d'un CommandButton dans une UserForm. Donc il n'y a rien d'anormal à retrouver le même nom puisque VBA ne fera jamais la confusion... Les boutons dans un onglet ont leur code dans le composant VBA de l'onglet (Feuil1(Feuil1) par exemple) et ceux d'une Userform ont leur code dans le composant VBA de l'UserForm (UserForm1 par exemple).

Seconde question :
CurrentRegion correspond bien aux cellules adjacentes. Il est d'usage d'utiliser la ligne contenant les étiquettes ou en-têtes, donc la ligne 1 et la première colonne, donc la colonne A. Mais comme tu le dis, B1, aurait aussi bien fait l'affaire. Cependant. il vaut mieux éviter des cellules au milieu du tableau car si elles sont entourées de cellules vides, CurrentRegion renvoie une plage erronée. En cas de doute, teste avec un Range("Ta_Cellule").CurrentRegion.Select et vérifie que cela englobe bien tout le tableau...
Oui les lignes ajoutées seront intégrées à condition qu'il n'y ait pas une ligne complète de cellules vides séparant les données (idem pour les colonnes)

Troisième question :
J'avais supprimé les options ALL car le code commence par supprimer tous les filtres dès que l'on clique sur le bouton OK avec la ligne :
If T.FilterMode = True Then T.Range("A1").CurrentRegion.AutoFilter. Donc par défaut, c'est toujours ALL si aucune autre valeur n'est sélectionnée... Utiliser les options ALL était finalement plus compliqué à gérer...
0
Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017 > ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022
27 avril 2017 à 14:46
Ok, c'est bien ce que je pensais pour 1- et 2-.
Quant à 3- j'ai mieux saisi cette condition.
Mille mercis, encore, je marque comme résolu !
0
Dianex87 Messages postés 79 Date d'inscription jeudi 9 mars 2017 Statut Membre Dernière intervention 8 août 2017
27 avril 2017 à 11:42
Je reviens car j'ai trouvé a priori !! :)


Private Sub CommandButton1_Click() 'bouton "OK"
Dim T As Worksheet

Set T = Worksheets("TOPICS")
If T.FilterMode = True Then T.Range("A1").CurrentRegion.AutoFilter 'si l'onglet est filtré, supprime le filte

If Me.ComboBoxSupplier.Value <> "*Suppliers" Then T.Range("A1").CurrentRegion.AutoFilter Field:=2, Criteria1:=Me.ComboBoxSupplier.Value
If Me.ComboBoxSupplier.Value = "ALL Suppliers" Then T.Range("A1").CurrentRegion.AutoFilter Field:=2

If Me.ComboBoxAirline.Value <> "*A/L" Then T.Range("A1").CurrentRegion.AutoFilter Field:=3, Criteria1:=Me.ComboBoxAirline.Value
If Me.ComboBoxAirline.Value = "ALL A/L" Then T.Range("A1").CurrentRegion.AutoFilter Field:=3

T.Select
Unload Me
End Sub


L'étoile * qui fermait mes chaines de caractère était visiblement de trop.
J'attends néanmoins tes commentaires pour les interrogations soulevées à mon precedent post, et of course si t'as des remarques sur ce code...

Merci encore!!
Diane
0