Fonction Match avec plusieurs critères

Salut,

Tout est dans le titre : est ce qu'il y a une possibilité d'utiliser la fonction match avec plusieurs critères ?

Ma base de données est triée par ordre alphabetique par matériel en colonne B (avion, hélico, planeur, moteur et hélice), puis par constructeur en colonne K, puis par type en colonne D.

Quand un matériel est choisi dans un ListBox, j'utilise la fonction match pour trouver la première ligne du matériel puis la fonction CountIf pour compter le nombre d'occurences, ça me limite le nombre de lignes à parcourir pour lister les constructeurs correspondant au matériel. A terme quand la base comportera plusieurs milliers d'entrées ce sera indspensable pour ne pas avoir des temps de calcul trop longs.

Le problème est que certains constructeurs font à la fois des avions et des planeurs mais la fonction Match me renvoie la première occurence du constructeur sans tenir compte du matériel.

J'ai mis une version purgée du fichier en pièce jointe, le problème apparait dans " Paramètres ", " Créer / modifier un type matériel " quand on choisi matériel = " Planeur " et constructeur = " Grob ". La fonction Match renvoie la première ligne correspondant à Grob dans l'onglet Type Matériel (la 21) alors qu'elle correspond au matériel " Avion " et pas au matériel " Planeur " sélectionné.

Il faudrait que la fonction match me fasse remonter la ligne 159 qui correspond au cumul des critères matériel = " Planeur " et constructeur = " Grob ".

Et le tout avec des n° de colonnes définis par des variables et des critères définis par des Combo.ListBox et non pas en dur dans la macro

D'ou ma question. J'ai fouillé sur le net, j'ai pas trouvé grand chose.

Merci d'avance.

Manu

Bonjour,

C'est possible notamment en passant par la fonction evaluate. Exemple :

pos = Evaluate("MATCH(1, (A1:A10=" & var1 & ")*(B1:B10=" & var2 & "), 0)")

Où les critères sont les variables var1 et var 2.

Sinon, on peut toujours utiliser une fonction personnalisée :

function MATCH2(plage1 as range, critere1, plage2 as range, critere2)
t1 = plage1.value
t2 = plage2.value
for i = lbound(t1) to ubound(t1)
    if t1(i, 1) like critere1 and t2(i, 1) like critere2 then
        MATCH2 = i
        exit function
    end if
next i
end function

Il faut des plages (vecteurs colonne ici) de même taille évidemment.

Ensuite, dans le code :

pos = MATCH2(range("A1:A10"), var1, range("B1:B10"), var2)

Cdlt,

Salut

La solution me plait bien, elle est simple et je comprend le principe. Mais dans le code je n'arrive pas à remplacer le " Range("A1:A10") " par la variable qui défini ma colonne.

Merci d'avance.

Manu

Finalement je m'en suis sorti en créant une colonne où je concatene les différents critières, et je fais ma recherche avec la fonction Match sur cette colonne.

Manu

Bonjour Manu,

Merci d'être revenu pour le dire !

Je ne sais pas quel problème vous avez rencontré mais je pense que la fonction marche. Si vous voulez essayer, postez le code que vous avez et dites-moi la ligne bloquante (et éventuellement le message d'erreur). Sinon, je ne peux rien faire car j'estime que le code que j'ai fourni est fonctionnel.

Cdlt,

Le code fonctionne très bien mais mon range est défini par des variables, donc ne peut pas être écrit en dur dans la commande. C'est sur le remplacement de " Range ("A1:A10") par Columns(variable) que j'ai bloqué.

Manu

Bonjour,

Et ca y est, ça marche finalement ?

Il suffit de mettre un objet range qui soit une colonne (sinon, il faudrait adapter pour les lignes) pour que ça marche :

pos = MATCH2(columns(1), var1, columns(2), var2)

ou

pos = MATCH2(columns(nocol1), var1, columns(nocol2), var2)

ou encore :

set r1 = columns(1)
set r2 = columns(2)
pos = MATCH2(r1, var1, r2, var2)

Il faut juste, comme avec les fonctions multi-critères classiques, que les 2 plages aient le même nombre de lignes...

Cdlt,

Merci du retour. J'essaierai quand j'aurais fini histoire de simplifier le code.

Manu

Rechercher des sujets similaires à "fonction match criteres"