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 !!!
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
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 !)
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:
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