[VBA] Recherche multicritères (listbox et filtre élaboré)

cabubu

XLDnaute Nouveau
Bonjour à tous,

Grande débutante en VBA, je suis quand même assez fière d'avoir réussi ce qui suit (extrait de mon fichier en PJ) avec l'aide notamment des archives de ce forum (merci !)
Je souhaite mettre à disposition de mes collègues un outil leur permettant de rechercher un document cartographique dans un tableau saisi sous Excel. J'ai donc créé un formulaire de recherche par thématique, étendue géographique et service demandeur (bouton dans la feuille 'Rechercher').

Tout fonctionne (presque) à merveille, mais je bute sur une dernière petite chose et je ne parviens pas à trouver de réponse sur les différents forums.
Mon formulaire me permet, grâce à un filtre élaboré, de croiser les critères : par exemple, je peux chercher une carte portant sur la thématique 'Loisirs' ET localisée sur le centre-ville, ou une carte 'Déplacements' ET demandée par le 'Pôle Espace public'.
Mais je souhaiterais également pouvoir choisir plusieurs critères dans une même liste. Par exemple, toutes les cartes 'Loisirs' OU ' Déplacements' dans la listbox 'Thématique', ou bien les cartes 'Centre-ville' OU 'Bourg' dans la listbox 'Étendue géographique'. Mes listbox permettent bien la multi sélection, mais lorsque je sélectionne deux critères dans une même liste, il ne me trouve aucune carte. C'est logique puisqu'il utilise le même opérateur 'ET' que quand il crée le filtre avec deux listbox.
En fait, pour résumer, il faudrait que j'aie un filtre qui me permette à la fois le ET entre les listbox (comme c'est déjà le cas) et le OU dans une même listbox (et là je bloque).

J'espère que je suis assez claire et que quelqu'un va pouvoir m'aider malgré les vacances !!!

Je vous souhaite une bonne journée.
Catherine
 

Pièces jointes

  • 20150731_BDCartothèqueForum.xlsm
    83.3 KB · Affichages: 198
C

Compte Supprimé 979

Guest
Re : [VBA] Recherche multicritères (listbox et filtre élaboré)

Bonjour cabubu, Bienvenue et joli travaille ;)

Juste une petite question, quand tu vas cliquer sur "Aménagement" et "Loisirs" dans la 1ère Listbox
Et "Centre-ville" et "Bourg" dans la 2ème

Comment veux-tu gérer les associations "Aménagement" et "Centre-ville " ou "Aménagement" et "Bourg" par exemple !?

A+
 

cabubu

XLDnaute Nouveau
Re : [VBA] Recherche multicritères (listbox et filtre élaboré)

Bonjour,

Merci pour vos réponses BrunnoM45 et tatiak

J'ai posté sur deux forums effectivement pour avoir une réponse, les deux forums m'ayant bien aidée pour écrire mon code.
Du coup j'ai donc eu ma soluce chez les voisins en effet. Mais j'ai bien sûr testé la tienne aussi tatiak, c'est la moindre des choses.

Cela pourrait fonctionner, mais la requête SQL "m'oblige" à choisir des critères dans chacune des listes ET aussi dans la ComboBox 'Demandeur' (la condition ci-dessous)
Code:
If Not Me.CboDemandeur.Value = "" Then
            lig = SQL.Get_List(thema_select, geo_select, Me.CboDemandeur.Value)
Si je ne le fais pas, je n'ai aucune réponse. Et je veux pouvoir aussi choisir un seul critère (par exemple toutes les cartes "Loisirs") ou deux, bref, avoir le choix de ne pas sélectionner un item dans chaque liste.

Et puis comme je débute, je n' ai pas tout compris dans le code, notamment cette partie-là :
Code:
ReDim thema_select(0)
    With Me.ListThema
        For i = 0 To .ListCount - 1
            If .Selected(i) = True Then
                l1 = l1 + 1
                ReDim Preserve thema_select(l1)
                thema_select(l1 - 1) = .List(i)
            End If
        Next i
    End With
Pourrais-tu, si tu as le temps, me "traduire", juste pour ma gouverne (ReDim correspond-il à une re-déclaration de variable et pour quelle raison, par exemple ?)

En tous les cas, un grand merci du temps passé à me répondre et mes excuses si j'ai enfreint une règle.
Catherine
 

cabubu

XLDnaute Nouveau
Re : [VBA] Recherche multicritères (listbox et filtre élaboré)

Merci, merci, cela m'éclaire et fonctionne parfaitement !

Pas de soucis, avec un aménagement mineur du code on donne le choix à l'utilisateur de définir un seul des 3 critères de recherche ou plusieurs.

Oui, effectivement, c'est très mineur ! Et c'est une bonne nouvelle d'apprendre qu'on peut utiliser des requêtes SQL dans du code VBA, elles me sont un peu plus familières.

Tes explications sont très claires, tout ce qu'il me faut... je ne savais même pas qu'il s'agissait de variables tableau... hum. Mais du coup je comprends mieux comment ça marche et l'histoire des l1 = l1 + 1 (re-hum !)

Bonne fin de journée
Catherine
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : [VBA] Recherche multicritères (listbox et filtre élaboré)

Bonsoir,

Version sans formulaire +VBA minimum


Le critère donne une intersection de 3 ensembles (listes). Il peut être porté à une intersection de x ensembles.


=(SI(NBVAL(CritThematique)=0;VRAI;SOMMEPROD(--(CritThematique=C9))))*(SI(NBVAL(CritEtendue)=0;VRAI;SOMMEPROD(--(CritEtendue=H9))))*(SI(NBVAL(CritDEmandeur)=0;VRAI;SOMMEPROD(--(CritDEmandeur=I9))))

Cf Le filtre élaboré: intersection d'ensembles

http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreElaboreEnsemble3.xls
http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreElaboreEnsemble3Form.xls
http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreElaboreEnsemble3Form2.xls

Avec formulaire

La solution formulaire ne conserve pas de trace de la requête.
Sur cette version, une trace de la requête est affichée avec le résultat de l'extraction:

Sans titre.jpg

Code:
Private Sub UserForm_Initialize()
  Me.ListBox1.List = [thematique].Value
  Me.ListBox2.List = [etendue].Value
  Me.ListBox3.List = [demandeur].Value
  raz
End Sub

Private Sub ListBox1_Change()
  Range("CritThematique").ClearContents
  For i = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(i) Then j = j + 1: Range("CritThematique").Cells(j, 1).Value = Me.ListBox1.List(i, 0)
  Next i
End Sub

Private Sub ListBox2_Change()
  Range("CritEtendue").ClearContents
  For i = 0 To Me.ListBox2.ListCount - 1
    If Me.ListBox2.Selected(i) Then j = j + 1: Range("CritEtendue").Cells(j, 1).Value = Me.ListBox2.List(i, 0)
  Next i
End Sub

Private Sub ListBox3_Change()
  Range("CritDemandeur").ClearContents
  For i = 0 To Me.ListBox3.ListCount - 1
    If Me.ListBox3.Selected(i) Then j = j + 1: Range("CritDemandeur").Cells(j, 1).Value = Me.ListBox3.List(i, 0)
  Next i
End Sub

Private Sub b_raz_Click()
  For i = 0 To Me.ListBox1.ListCount - 1: Me.ListBox1.Selected(i) = False: Next
  For i = 0 To Me.ListBox2.ListCount - 1: Me.ListBox2.Selected(i) = False: Next
  For i = 0 To Me.ListBox3.ListCount - 1: Me.ListBox3.Selected(i) = False: Next
  raz
  Extrait
End Sub

Private Sub b_extrait_Click()
 Extrait
End Sub

Pour compliquer, on peut générer la formule de critère par VBA au lieu d'utiliser la formule

=(SI(NBVAL(CritThematique)=0;VRAI;SOMMEPROD(--(CritThematique=C9))))*(SI(NBVAL(CritEtendue)=0;VRAI;SOMMEPROD(--(CritEtendue=H9))))*(SI(NBVAL(CritDEmandeur)=0;VRAI;SOMMEPROD(--(CritDEmandeur=I9))))

http://boisgontierjacques.free.fr/fichiers/Filtre/FiltreElaboreEnsemble3Form2FormuleVBA.xls

JB
 

Pièces jointes

  • FiltreElaboreEnsemblezz.xls
    217.5 KB · Affichages: 107
  • FiltreElaboreEnsemblezz.xls
    217.5 KB · Affichages: 130
  • FiltreElaboreEnsemble3Form.xls
    258.5 KB · Affichages: 89
  • FiltreElaboreEnsemble3Form2.xls
    271 KB · Affichages: 157
  • Sans titre.jpg
    Sans titre.jpg
    60.2 KB · Affichages: 208
  • Sans titre.jpg
    Sans titre.jpg
    60.2 KB · Affichages: 263
Dernière édition:

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth