Creer fonction recherche multicritère VBA

Tibo2

XLDnaute Nouveau
Bonjour à tous,

Je suis débutant en vba et rencontre déjà mes premiers blocages.
Je souhaite créer une fonction assez simple de calcul dans laquelle j'ai besoin de rechercher la position d'une cellule (en fait d'une colonne) pour lui prendre ça valeur.

Cette recherche dépend d'au moins 3 critères. Imaginer un tableau avec 3 en-têtes (catégorie, sous-catégorie, sous-sous catégorie). En fouillant sur différents forum j'ai trouver la technique du:

Evaluate("match(1,(PlageDonneeCategorie=""critere1"")*(PlageDonneeSousCategorie=""critere2""),0)") qui fonctionne très bien quand est inclu dans la procédure la critere1 et critere2.

Par contre lorsque l'on cree une fonction ça ne marche plus du tout:

Function Etat(PlageDonneeCategorie As Range, PlageDonneeSousCategorie As Range, critere1, critere2)

Dim MyVar As Double

MyVar = Evaluate("Application.WorksheetFunction.Match(1,(PlageDonneeCategorie=critere1)*(PlageDonneeSousCategorie=critere2),0)")

Etat=MyVar

End Function

Les plages de données sont déjà définies dans la feuille Excel. Critere1 et 2 corresponde à des cellules sont tu texte dans des cellules (par exemple F1 et F2). J'ai l'impression qu'il ne comprend pas ce que sont critere1 et 2. Je ne sais pas comment les définir.

Si quelqu'un à une idée, merci d'avance,

Tibo
 
C

Compte Supprimé 979

Guest
Re : Creer fonction recherche multicritère VBA

Bonjour Tibo2 et bienvenue sur ce forum

Sans fichier et en l'état je verrais bien un problème de guillemets oubliés
Quand la recherche est du texte, il faut encadré le critère par 2 guillemets et sortir les variables

Code:
MyVar = Evaluate("Application.WorksheetFunction.Match(1,(" & PlageDonneeCategorie & "=""" & critere1 & """)*(" & PlageDonneeSousCategorie & "=""" & critere2 & """),0)")
A+
 

Tibo2

XLDnaute Nouveau
Re : Creer fonction recherche multicritère VBA

Salut Bruno,

Je viens d'essayer ça ne marche pas. Je suis persuadé que j'oublie de faire qqch d'évident pour que cela marche... Il semble vraiment que ca soit le problème de charger qqch depuis la feuille qui pause problème. En pièce jointe le fichier cette fois.

Merci
 

Pièces jointes

  • VE_Profils_20120510.xlsm
    23.7 KB · Affichages: 264
  • VE_Profils_20120510.xlsm
    23.7 KB · Affichages: 273
  • VE_Profils_20120510.xlsm
    23.7 KB · Affichages: 282

ChTi160

XLDnaute Barbatruc
Re : Creer fonction recherche multicritère VBA

Bonjour Tibo2
Bonjour le Fil
Bonjour le Forum

je pense que le problème vient du fait que tu passes en arguments de la fonction des Arguments qui ne correspondent pas à ceux nécessaires à cette fonction
tu mets dans la cellule
=EtatBatterie(Annee;Categorie;2013;2011) '
soit une annee ,Categorie et deux dates
alors que la function demande les arguments suivants
Public Function EtatBatterie(MaPlageRecherche1 As Range, MaPlageRecherche2 As Range, Critere1, Critere2)
ici la fonction demande argument 1 une plage de cellules , en deuxième argument une plage de cellules ,puis deux critères (annees je pense)


a voir donc
Bonne journée
Amicalement
Jean marie
 

Tibo2

XLDnaute Nouveau
Re : Creer fonction recherche multicritère VBA

Bonjour Jean-Marie,

Il ne me semble pas que je me sois trompé, Annee et Categorie sont des plages de cellules. Je les ai défini à l'aide du gestionnaire de nom d'excel. Pris individuellement avec la formule:

match(critere1, MaPlageRecherche1, 0) cela marche...

Pour les deux autres critères je n'ai rien fixé pour le moment mais je pourrai effectivement.

Merci pour l'aide,
 

Tibo2

XLDnaute Nouveau
Re : Creer fonction recherche multicritère VBA

Le problème peut se résumé au final à, quelle est la différence entre les deux codes suivant:

Public Function essai1()
essai3 = Evaluate("match(1,(Annee=E3)*(Client=E4),0)")
End Function

Public Function essai2(Critere1 As Range, Critere2 As Range)
essai2 = Evaluate("match(1,(Annee=Critere1)*(Client=Critere2),0)")
End Function

Alors que lorsque j'utilise essaie2 Critere1 est la cellule E3 et Critere2 la cellule E4? Je pense que je définis mal quelque chose mais je ne comprends pas. En fait comment le code VBA considère E3 et E4? En pièce jointe le fichier.

De manière plus général, je souhaite écrire une fonction qui soit capable selon la cellule où elle s'applique d'aller chercher dans la cette feuille et d'autres feuille du même classeur certaines informations pour faire ses calculs. Hors pour aller chercher ces informations j'ai souvent besoin de 2, 3 voir 4 critère dans mes feuilles. Par exemple, dans le fichier Excel en pièce jointe mes critères pourrait être Annee=2012, Client=Dysney, ProfilRouleur=20 et Parametre=EnergieDelivree.


J'espère avoir été clair et merci encore
 

Pièces jointes

  • VE_Profils_20120510.xlsm
    24.5 KB · Affichages: 198
  • VE_Profils_20120510.xlsm
    24.5 KB · Affichages: 213
  • VE_Profils_20120510.xlsm
    24.5 KB · Affichages: 222

Tibo2

XLDnaute Nouveau
Re : Creer fonction recherche multicritère VBA

Bonjour à tous,

Je vois que mon post n'a pas déchainé les passions... Mais en relisant mon message je vois que je n'ai pas été très clair et que ça ne donne pas forcement envie de répondre.

Je n'arrive toujours pas à comprendre comment faire une recherche multicritère et ce, malgré les explications de la page Recherche sur plusieurs critères dans une table, par formule ou en VBA | www.excelabo.net

En pièce jointe, un excel tout simple, 2 colonne: la première colonne en B avec une liste de client, la deuxième colonne en C avec une liste de catégorie. Je veux obtenir le numéro de ligne du couple (client, catégorie) que je recherche. A la suite le codonne

Code:
Public Function essai2(Critere1 As Range, Critere2 As Range)

With Worksheets("Feuil1")
    Set PlageClient = .Range(.[B4], .[B100].End(xlUp))
    Set PlageCategorie = .Range(.[C4], .[C100].End(xlUp))
End With
MsgBox 1

essai2 = Application.WorksheetFunction.Match(1, (PlageClient = Critere1.Value) * (PlageCategorie = Critere2.Value), 0)
'essai2 = Application.WorksheetFunction.Match(1, (PlageClient = """ &Critere1.Value & """) * (PlageCategorie = """ & Critere2.Value & """), 0)
'essai2 = Application.WorksheetFunction.Match(1,(" & PlageClient & "=""" & Critere1 & """)*(" & PlageCategorie & "=""" & Critere2 & """),0)
End Function

Si quelqu'un a une idée, cela m'aiderait grandement...

Merci d'avance
 

Pièces jointes

  • Essai.xlsm
    18.6 KB · Affichages: 195
  • Essai.xlsm
    18.6 KB · Affichages: 204
  • Essai.xlsm
    18.6 KB · Affichages: 217
C

Compte Supprimé 979

Guest
Re : Creer fonction recherche multicritère VBA

Bonjour Tibo2,

Voici une fonction plus simple si tu n'as pas de doublons dans ta recherche,
comme c'est le cas dans ton exemple
VB:
Public Function Essai4(Rng1 As Range, Crit1 As String, Rng2 As Range, Crit2 As String)
  Dim Formule As String, LigF As Long
  ' vérifier le nombre de cellules dans les 2 plages
  If Rng1.Count <> Rng2.Count Then
    MsgBox "Les deux plage doivent être de la même longueur", vbCritical, "ATTENTION ..."
    Essai4 = "#REF!"
    Exit Function
  End If
  ' Créer la formule
  Formule = "SUMPRODUCT((" & Rng1.Address & "=""" & Crit1 & """)*(" & Rng2.Address & "=""" & Crit2 & """)*ROW(" & Rng1.Address & "))"
  ' Evaluer la formule
  LigF = 0: LigF = Application.Evaluate(Formule)
  ' Renvoyer la valeur
  Essai4 = LigF
End Function

Et pour appeler la fonction il faut utiliser la formule
Code:
=Essai4(Plage1;Critère1;Plage2;Critère2)

A+
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 505
Messages
2 089 070
Membres
104 020
dernier inscrit
Mzghal