Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recherche multicritères

21 réponses
Avatar
Jean-Paul V
Bonjour à tous
Comment trouver dans une Base de Donnée la ligne correspondant à un choix
multicritère ?
Comme souvent, j’ai trouvé la solution dans Excelabo :
J’ai donc fait le test suivant qui fonctionne bien dans mon fichier ou je
choisi un Auteur une Oeuvre , une image ( Photo pochette de disque ) .
Range("essai").Value = Evaluate("MATCH(1,(Auteur=""BACH"")*(Oeuvre=""Cantate
N°244"")*(Image=""BACH5.jpg""),0)") + 1
Les champs Auteur , Oeuvre , Image sont des champs dynamiques définis avec
les fonctions DECALER
Pourquoi lorsque je définis trois variables grâce à 3 ListBox en cascades :
monauteur = Me.choixnom.List(Me.choixnom.ListIndex)
monoeuvre = Me.ChoixOeuvre.List(Me.ChoixOeuvre.ListIndex)
mondisque = Me.ChoixDisque.List(Me.ChoixDisque.ListIndex)
l’instruction suivante se plante (erreur de syntaxe):
Range("essai").Value =
Evaluate("MATCH(1,(Auteur="&monauteur&")*(Oeuvre="&monoeuvre&")*(Image="&mondisque&"),0)") + 1
Comment corriger l’instruction ?
Est-ce que Flo Cabon se serait plantée pour le passage à des variables…ou
bien j'ai mal compris cette partie..


à + j’espère

--
Jean-Paul V

1 réponse

1 2 3
Avatar
Jean-Paul V
C'est formidable grâce à cette dernière réponse détaillée que vous m'avez
donnée j'ai réussi à écrire ma macro en plus cela fonctionne avec des champs
dynamiques et j'ai réussi à me passer des range intermédiaires
Merci pour cette aide précieuse
Pour info cela donne dans mon fichier :
Sub TestJPV()
Dim MonImage As String
Dim MonOeuvre As String
Dim MonAuteur As String
Dim UneVariable As String
Dim X As Long
Dim Y As Long
'Essayons maintenant d'alimenter les variables avec les ListBox en
cascade définies par l'initialisation du Userform "Formulaire"
Formulaire.Show
'Affecter aux 3 variables MonAuteur , MonOeuvre , MonImage les valeurs
des 3 ListBox
MonAuteur = Formulaire.choixnom.List(Formulaire.choixnom.ListIndex)
MonOeuvre =
Formulaire.ChoixOeuvre.List(Formulaire.ChoixOeuvre.ListIndex)
MonImage = Formulaire.ChoixDisque.List(Formulaire.ChoixDisque.ListIndex)
' Modifier les variables où on a libellé pour obtenir "libellé"
MonAuteur = """" & MonAuteur & """"
MonOeuvre = """" & MonOeuvre & """"
MonImage = """" & MonImage & """"
''Vérifier que les variables sont correctes, ce n'est plus utile puisque ça
marche
' Range("MonAuteur") = MonAuteur
' Range("MonOeuvre") = MonOeuvre
' Range("MonImage") = MonImage
'la formule qui permet de trouver la ligne du trio choisi
Formule = "MATCH(1,(Auteur=" & MonAuteur & ")*(" & _
"Oeuvre=" & MonOeuvre & ")*(" & _
"Image=" & MonImage & "),0)+1"
'Affecter le résultat de cette formule dans la cellule pour vérif
With Worksheets("BD")
.Range("L2").Value = Evaluate(Formule)
End With
End Sub
Bonne soirée
Jean-Paul V


"michdenis" wrote:

Pour la formule, c'est celle que j'ai copiée à partir
d'un message sur ce fil, me semble-t-il !

Effectivement, tu as raison.
a ) pour le +1 , il s'agit de l'enlever si tu veux obtenir
le numéro de la ligne trouvée par la formule.


b ) Le 3 ième argument de la fonction Match(equiv) est
absent "omis" dans la formule. Dans ce cas, les données
de la plage doivent être en ordre croissant ce qui n'est
pas vrai dans l'exemple des données soumis. Ce paramètre
peut prendre 3 valeurs (-1, 0, 1) selon la présentation des
données. Consulte l'aide pour savoir lequel est le plus
approprié à ton tableau des données.


2 Façons d'écrire la formule en VBA :

Formule = "MATCH(1,(" & .Name & "!" & _
.Range("MonImage").Address & _
"=" & MonImage & ")*(" & .Name & "!" & _
.Range("MonOeuvre").Address & "=" & _
MonOeuvre & ")*(" & .Name & "!" & _
.Range("MonAuteur").Address & "=" & _
MonAuteur & "),0)"

Formule = "MATCH(1,(MonImage=" & MonImage & ")*(" & _
"MonOeuvre=" & MonOeuvre & ")*(" & _
"MonAuteur=" & MonAuteur & "),0)"

Je réitère l'avertissement : ne pas se méprendre entre le nom
des plages de cellules et le nom de la variable portant le même
nom.




"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour MichDenis
J'ai regardé votre fichier, on constate que votre macro donne non pas le n°
de ligne mais n° de ligne + 1.
Et bizarrement si je change dans la macro les variables A3 , C3 , B3 en A2
C2 B2 cela donne 6 donc ligne + 4 je ne comprends pas pourquoi je ne trouve
pas 3 au lieu de 6
--
Jean-Paul V


"michdenis" wrote:

> http://cjoint.com/?jrryPy8h83
>
>
>
> "Jean-Paul V" a écrit dans le message de groupe de
> discussion :
>
> Je ne vois pas de macro dans ton fichier que j'ai chargé sur mon micro
> NB: puisque tu as créé des champs ta fonction matricielle avec des nom de
> champs donne :
> {=EQUIV(1;(MonImage="denis3")*(MonOeuvre="Sonate")*(MonAuteur="Bach"))+1}
> --
> Jean-Paul V
>
>
> "michdenis" wrote:
>
> > Un fichier exemple là : http://cjoint.com/?jrnfDplfoD
> >
> >
> >
> > "Jean-Paul V" a écrit dans le message de groupe
> > de
> > discussion :
> > Bonjour MichDenis
> >
> > J'ai essayé de reprendre ta macro en ajoutant les variables calculées.
> > Je n'ai pas pu garder :
> > MonImage = """ & .range("A1") & """ 'car VBA voit rouge dès l'écriture et
> > ça se plante ( Version Excel 2000 ) j'ai donc fait les corrections suivantes.
> > La macro avec les variables telles que tu les a précédemment définies avec 3
> > """ pourrait donner ceci, mais bien que je me suis assuré que j'ai en L1 , M1
> > , N1 des variable correctes cela se plante sur X = Evaluate...erreur 13
> > incompatibilité de type
> > '----------------------------------------------------
> > Sub TestMichDenisVariableCalculée()
> > 'Déclaration des variable
> > Dim MonImage As String
> > Dim MonOeuvre As String
> > Dim MonAuteur As String
> > Dim X As Long
> > Formulaire.Show
> > With Worksheets("BD")
> > Range("L1").Value > > > Formulaire.ChoixDisque.List(Formulaire.ChoixDisque.ListIndex) 'ça c'est OK
> > Range("M1").Value > > > Formulaire.ChoixOeuvre.List(Formulaire.ChoixOeuvre.ListIndex)
> > Range("N1").Value > > > Formulaire.choixnom.List(Formulaire.choixnom.ListIndex)
> > ' MonImage = """ & .range("L1") & """ 'ce plante et voit rouge dès
> > l'écriture
> > ' MonOeuvre = """ & .range("M1") & """
> > ' MonAuteur = """ & .range("N1") & """
> > MonImage = .Range("L1")
> > MonImage = """""""" & MonImage & """"""""
> > MonOeuvre = .Range("M1")
> > MonOeuvre = """""""" & MonOeuvre & """"""""
> > MonAuteur = .Range("N1")
> > MonAuteur = """""""" & MonAuteur & """"""""
> > 'Juste pour m'assurer que j'ai bien """ """ dans mes variables et
> > ça marche ! !
> > Range("L1").Value = MonImage
> > Range("M1").Value = MonOeuvre
> > Range("N1").Value = MonAuteur
> > End With
> > 'NB- On pourrait remplacer les "Range" par la valeur des textbox
> > X = Evaluate("=MATCH(1,(Image=" & MonImage & _
> > ")*(Oeuvre=" & MonOeuvre & _
> > ")*(Auteur=" & MonAuteur & "),0)+1")
> > End Sub
> > '----------------------------------------------------
> > Faut-il jeter l'éponge ?
> > http://cjoint.com/?jrjHJUngwB
> > --
> > Jean-Paul V
> >
> >
> > "michdenis" wrote:
> >
> > > Toujours la même procédure, mais si la valeur
> > > de tes variables est dans des cellules d'une feuille de calcul
> > > '----------------------------------------------------
> > > Sub test()
> > > 'Déclaration des variable
> > > Dim MonImage As String
> > > Dim MonOeuvre As String
> > > Dim MonAuteur As String
> > > Dim X As Long
> > >
> > > 'Renseigne les variables
> > > With Worksheets("NomDeLaFeuille"
> > > MonImage = """ & .range("A1") & """
> > > MonOeuvre = """ & .range("A2") & """
> > > MonAuteur = """ & .range("A3") & """
> > > End With
> > > 'NB- On pourrait remplacer les "Range" par la valeur des textbox
> > > 'C'est beaucoup plus facile de travailler de cette façon quand il
> > > 'y a plusieurs variables... tu as le choix !
> > >
> > > X = Evaluate("=MATCH(1,(Image=" & MonImage & _
> > > ")*(Oeuvre=" & MonOeuvre & _
> > > ")*(Auteur=" & MonAuteur & "),0)+1")
> > >
> > > End Sub
> > > '----------------------------------------------------
> > >
> > > Pourquoi autant de guillemets autour des variables :
> > >
> > > Je t'ai fait un petit exemple : Suppose que tu veuilles
> > > afficher dans une boîte de message la valeur d'une
> > > variable mais entouré de guillemets : il y a 2 façons
> > > de faire... et je préfère de loin la deuxième approche.
> > > Dans cette dernière : les premiers guillemets "Denis"
> > > sert à délimiter la chaîne de caractères. Comme il est
> > > demandé d'afficher la variable entourée de guillemets
> > > il faut alors les dédoubler, donc, ajouter 2 guillemets de
> > > chaque côté de "Denis" -> """Denis"""
> > >
> > > '------------------------------------
> > > Sub test1()
> > > Dim Nom As String
> > > Nom = "denis"
> > > MsgBox "Bonjour " & """" & Nom & """"
> > > End Sub
> > > '------------------------------------
> > > Sub test2()
> > > Dim Nom As String
> > > Nom = """denis"""
> > > MsgBox "Bonjour " & Nom
> > > End Sub
> > > '------------------------------------
> > >
> > >
> > >
> > >
> > >
> > > "Jean-Paul V" a écrit dans le message de
> > > groupe
> > > de
> > > discussion :
> > >
> > > Bonjour MichDenis
> > > Votre macro marche mais sans variable calculée.
> > > J’ai regardé votre macro Test, et je me suis dit en voyant :
> > > MonImage = """BACH5.jpg""" mais bon sang est-ce que Excel ferait une
> > > allergie au String pour qu’il faille 3 " pour qu’il comprenne que BACH5.jpg
> > > est mon String.
> > > Finalement j’ai trouvé cette macro qui marche également mais que je
> > > comprends mieux :
> > > Sub Test2()
> > > 'Déclaration des variables cela ne semble pas nécessaire, ça marche sans
> > > ' Dim MonImage As String
> > > ' Dim MonOeuvre As String
> > > ' Dim MonAuteur As String
> > > ' Dim X As Long
> > > 'Avec ses variables j'obtiens bien le n° de ligne dans le Range "essai"
> > > MonImage = "BACH5.jpg"
> > > MonOeuvre = "Cantate N°244"
> > > MonAuteur = "BACH"
> > > X = Evaluate("=MATCH(1,(Image=""" & MonImage & _
> > > """)*(Oeuvre=""" & MonOeuvre & _
> > > """)*(Auteur=""" & MonAuteur & """),0)+1")
> > > Range("essai").Value = X 'ça marche j'ai ce que je cherche c'est à dire
> > > la ligne
> > > Range("essai2").Value = """BACH5.jpg""" 'permet d'obtenir "BACH5.jpg"
> > > Range("essai3").Value = "BACH5.jpg" 'permet d'obtenir BACH5.jpg
> > > End Sub
> > >
> > > Maintenant j’essaye de passer à 3 variables calculées données par les
> > > valeurs des 3 ListBox en cascade ( qui sont je vous le rappelle grâce à vous
> > > initialisées et sélectionnées dès l’ouverture du Userform « Formulaire »)
> > > Sub Test3()
> > > 'Déclaration des variable certaines ne sont pas utiles...
> > > ' Dim essai As Range
> > > ' Dim essai2 As Range
> > > ' Dim essai3 As Range
> > > ' Dim essai4 As Range
> > > Dim MonImage As String
> > > Dim MonOeuvre As String
> > > Dim MonAuteur As String
> > > Dim X As Long
> > > Dim Y As String
> > > 'Essayons maintenant d'alimenter les variables avec les ListBox en
> > > cascade définies par l'initialisation du Userform "Formulaire"
> > > Formulaire.Show
> > > Range("essai").Value > > > > Formulaire.ChoixDisque.List(Formulaire.ChoixDisque.ListIndex) 'ça c'est OK
> > > Range("essai2").Value > > > > Formulaire.ChoixOeuvre.List(Formulaire.ChoixOeuvre.ListIndex)
> > > Range("essai3").Value > > > > Formulaire.choixnom.List(Formulaire.choixnom.ListIndex)
> > > 'ce qui suit est pour obtenir dans ma variable les " "
> > > Range("essai5").Value = "=""""""""&essai&"""""""""
> > > Range("essai5").Select
> > > Selection.Copy 'et ça marche ! ! !
> > > Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> > > False, Transpose:úlse
> > > Range("essai6").Value = "=""""""""&essai2&"""""""""
> > > Range("essai6").Select
> > > Selection.Copy
> > > Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> > > False, Transpose:úlse
> > > Range("essai7").Value = "=""""""""&essai3&"""""""""
> > > Range("essai7").Select
> > > Selection.Copy
> > > Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> > > False, Transpose:úlse
> > > 'transférer dans mes 3 variables ce que je veux des trucs avec des " "
> > > MonImage = Range("essai5").Value
> > > MonOeuvre = Range("essai6").Value
> > > MonAuteur = Range("essai7").Value
> > > 'malheureusement ce qui suit se plante avec erreur 13
> > > X = Evaluate("=MATCH(1,(Image=""" & MonImage & _
> > > """)*(Oeuvre=""" & MonOeuvre & _
> > > """)*(Auteur=""" & MonAuteur & """),0)+1")
> > > Range("essai4").Value = X 'ça se plante au dessus
> > > End Sub
> > > 1) Comment éviter que ça se plante
> > > 2) Comment se passer de tous ces Ranges intermédiaires pour trouver X le n°
> > > de ligne de la feuille
> > > http://cjoint.com/?jqqzhXBpyH
> > > à + j’espère
> > >
> > >
> > > Jean-Paul V
> > >
> > >
> > > "michdenis" wrote:
> > >
> > > > Bonjour Jean-Paul,
> > > >
> > > > Voici un bout de code... et observe bien les guillements
> > > >
> > > > C'est une forme générique qui te permet de renseigner tes variables
> > > > avec les valeurs de ton choix
> > > > '----------------------------------------
> > > > Sub test()
> > > > 'Déclaration des variable
> > > > Dim MonImage As String
> > > > Dim MonOeuvre As String
> > > > Dim MonAuteur As String
> > > > Dim X As Long
> > > >
> > > > 'Renseigne les variables
> > > > MonImage = """BACH5.jpg"""
> > > > MonOeuvre = """Cantate"""
> > > > MonAuteur = """Bach5"""
> > > >


1 2 3