Microsoft 365 Création fonction rechercheV utilisant le resultat d'une autre

burger0715

XLDnaute Nouveau
Bonjour tout le monde !

J'aimerais créer une fonction qui utilise le résultat d'une rechercheV dans une autre. Pour l'instant j'ai quelque chose comme ça mais ça ne fonctionne pas :
Function RelationDestination(Destination As Range)
Application.Volatile
Dim App As Variant
If App = Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil2").Range("A5:D7"), 2,
False)=Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil3").Range("A6:B9"), 2, False)
Then ShowResult
Else: Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil2").Range("A5:D7"), 3, False) = Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil3").Range("A6:B9"), 2, False)
Then ShowResult
Else: Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil2").Range("A5:D7"), 4, False) = Application.WorksheetFunction.VLookup(Range("Destination"), Worksheets("Feuil3").Range("A6:B9"), 2, False)
Then ShowResult
End Function

(Je sais que ShowResult n'existe pas, mais c'est pour montrer ce que je souhaite faire, en gros montrer le resultat des recherchev).
N'hésitez pas a me demander de reepliquer si vous ne comprenez pas j'ai eu pas mal de difficulté à écrire ce que je pensais faire 😅

Merci beaucoup par avance !😁
 

Pièces jointes

  • Fichier Test RelationDistance.xlsm
    17.1 KB · Affichages: 4
Solution
Rebonjour,
J'ai au final réussi ce que je voulais faire :
Function RELATIONTEST2(Destination As Range)
Application.Volatile
Dim Plage2 As Range, Plage3 As Range, Col1, Col2, Col3, Col4, Resultat1, Resultat2, Resultat3, Resultat4
Set Plage2 = Sheets("Feuil2").Range("A5:D7")
Set Plage3 = Sheets("Feuil3").Range("A6:B9")

Col1 = Application.VLookup(Destination, Plage2, 1, False)
Col2 = Application.VLookup(Destination, Plage2, 2, False)
Col3 = Application.VLookup(Destination, Plage2, 3, False)
Col4 = Application.VLookup(Destination, Plage2, 4, False)
Resultat1 = Application.VLookup(Col1, Plage3, 2, False)
Resultat2 = Application.VLookup(Col2, Plage3, 2, False)
Resultat3 = Application.VLookup(Col3, Plage3, 2, False)
Resultat4 =...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Burger,
1-Une fonction doit se terminer par l'affectation du résultat dans le nom de la fonction.
Par ex vous devez terminer par :
VB:
RelationDestination=ShowResult
si ShowResult est la valeur trouvée.
2- Pourquoi Range("Destination") alors que Destination est une valeur pas une adresse.
3- Je ne vois pas ce que vous cherchez, mais avec cet algo ça ne peut pas marcher.
Ex en B3 : =RelationDestination(A3) donc =RelationDestination(Pontoise)
Vous cherchez cette valeur dans Feuil2 et vous récupérer la 2eme colonne, soit Cergy.
Et vous regardez si c'est égal au tableau feuil3 colonne B qui contient des nombres.
Donc d'un coté Cergy, de l'autre 20. Rien n'est homogène.
En PJ j'ai rectifié la structure des IF ELSEIf et l'affectation finale de la valeur.
Mais évidemment ça ne marche pas. Mais au moins la fonction ne donne pas d'erreur.
 

Pièces jointes

  • Fichier Test RelationDistance.xlsm
    17 KB · Affichages: 1

burger0715

XLDnaute Nouveau
Bonjour sylvanu,
Tout d'abord merci d'avoir essayé de m'aider. Je voulais utiliser "Destination" entre parenthese sur excel pour indiquer le texte Recherché (nomdelafonction("A6" par exemple)).
Ensuite je voulais créer une fonction pour regrouper plusieurs rechercheV sur une cellule en gros. Je dois faire des rechercheV imbriqués (avec 20 résultats possibles au lieu de 3 dans l'exemple que je vous ai fourni). Dans le fichier Excel que j'ai remis en pj, je vous ai fait un exemple de ce que cela fait sans VBA, pour que vous puissiez mieux comprendre. Je pense pas que ça soit difficile à faire, mais je ne sais pas comment faire pour compiler le resultat dans une seule cellule.

En vous remerciant par avance ! 😁
 

Pièces jointes

  • Fichier Test RelationDistance.xlsm
    18.4 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Pas sur d'avoir bien tout compris. :(
Un essai en PJ avec :
VB:
Function RelationDestination(Destination As Range)
    Dim Plage2 As Range, Plage3 As Range, PremierIndex$
    Set Plage2 = Sheets("Feuil2").Range("A5:B7")
    Set Plage3 = Sheets("Feuil3").Range("A6:B9")
    PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 2, False), "")
    RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
End Function
1- On recherche la destination en feuil2, on prend la valeur de la colonne B
2- On prend cette valeur, on la cherche en Feuil3 et on prend la valeur de la colonne B
3- On remonte cette valeur.
 

Pièces jointes

  • Fichier Test RelationDistance (1).xlsm
    19 KB · Affichages: 2

burger0715

XLDnaute Nouveau
Re,
C'est presque ça !! Maintenant, il faudrait juste que PremierIndex fonctionne sur chaque colonne, pour afficher tout les résultats possible. J'ai essayé de le faire moi-même mais ça me met une erreur de valeur, alors que pour moi si ça marche comme en fonction classique ça devrait fonctionner...

Function RelationDestination(Destination As Range)
Dim Plage2 As Range, Plage3 As Range, PremierIndex$
Set Plage2 = Sheets("Feuil2").Range("A5:D7")
Set Plage3 = Sheets("Feuil3").Range("A6:B9")
PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 1, False), Application.IfError(Application.VLookup(Destination, Plage2, 2, False)), Application.IfError(Application.VLookup(Destination, Plage2, 3, False)), Application.IfError(Application.VLookup(Destination, Plage2, 4, False)), "")
RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
End Function

J'ai également redimensionné Plage2 pour qu'elle prenne bien tout le tableau.

En remerciant encore une fois pour le temps accordé
 

Pièces jointes

  • Fichier Test RelationDistance.xlsm
    22 KB · Affichages: 1

burger0715

XLDnaute Nouveau
Bonjour Sylvanu,
J'ai retravaillé le code en adaptant une solution qui pourrait fonctionner avec des ElseIf. Malheureusement il n'affiche que des 0, comme s'il ne trouvait pas le résultat. Auriez vous une explication, car je ne comprends vraiment pas pourquoi cela ne fonctionne pas...

Function RelationDestination(Destination As Range)
Application.Volatile
Dim Plage2 As Range, Plage3 As Range, PremierIndex$
Set Plage2 = Sheets("Feuil2").Range("A5:D7")
Set Plage3 = Sheets("Feuil3").Range("A6:B9")
If PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 1, False), 0) <> 0 Then
RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
ElseIf PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 2, False), 0) <> 0 Then
RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
ElseIf PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 3, False), 0) <> 0 Then
RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
ElseIf PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 4, False), 0) <> 0 Then
RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
End If

End Function



En vous remerciant par avance
 

Pièces jointes

  • Fichier Test RelationDistance.xlsm
    22.1 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Inutile de fournir du code qui ne marche pas.
Donnez nous plutôt un vrai fichier test représentatif avec le chemin que vous parcourez.
Et la solution de l'exemple pris.
Et vous refaites la même chose.
Vous ne comprenez donc pas que pour vous aider, il faut que le contributeur comprenne ce que vous voulez faire ?
Quelque chose du genre :
1657629438422.png

Mais ça, c'est ce que j'ai proposé au post #4. Donc ce n'est pas ça.
Je préfère jeter l'éponge.
Peut être qu'un autre contributeur plus futé arrivera à vous comprendre.
 

burger0715

XLDnaute Nouveau
Mais je pensais que vous aviez compris étant donné que votre schéma est bon, et que le code que vous avez proposé correspondait presque à ce que je voulais faire. La seule chose qu'il ne faisait pas c'est qu'il ne prenait pas le cas ou la ville correspondant a celle de la Feuil3 était sur une autre colonne que la 2eme sur la Feuil2(le cas de Cholet - Chanverrie en colonne 3). En tout cas merci de m'avoir aidé quand même, et je m'excuse de n'avoir pas compris vos messages et pour le quiproquo
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Ca, c'était pour le moins pas évident à comprendre. surtout en balançant des codes qui ne marchent pas, on ne peut pas trouver d'où vient l'erreur.
Testez cette PJ.
Code:
Function RelationDestination(Destination As Range)
    Dim Plage2 As Range, Plage3 As Range, PremierIndex$
    Set Plage3 = Sheets("Feuil3").Range("A6:B9")
    Set Plage2 = Sheets("Feuil2").Range("A5:B7")
    PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 2, False), "")
    If PremierIndex <> "" Then RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
    Set Plage2 = Sheets("Feuil2").Range("B5:C7")
    PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 2, False), "")
    If PremierIndex <> "" Then RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
    Set Plage2 = Sheets("Feuil2").Range("C5:D7")
    PremierIndex = Application.IfError(Application.VLookup(Destination, Plage2, 2, False), "")
    If PremierIndex <> "" Then RelationDestination = Application.IfError(Application.VLookup(PremierIndex, Plage3, 2, False), "Pas de correspondance")
End Function
Pour info, un RechercheV recherche toujours le critère dans la première colonne à gauche. Il faut donc redéfinir la plage à chaque fois qu'on décale vers la droite.
 

Pièces jointes

  • Fichier Test RelationDistance (1) (1).xlsm
    30.9 KB · Affichages: 2

burger0715

XLDnaute Nouveau
Rebonjour,
J'ai au final réussi ce que je voulais faire :
Function RELATIONTEST2(Destination As Range)
Application.Volatile
Dim Plage2 As Range, Plage3 As Range, Col1, Col2, Col3, Col4, Resultat1, Resultat2, Resultat3, Resultat4
Set Plage2 = Sheets("Feuil2").Range("A5:D7")
Set Plage3 = Sheets("Feuil3").Range("A6:B9")

Col1 = Application.VLookup(Destination, Plage2, 1, False)
Col2 = Application.VLookup(Destination, Plage2, 2, False)
Col3 = Application.VLookup(Destination, Plage2, 3, False)
Col4 = Application.VLookup(Destination, Plage2, 4, False)
Resultat1 = Application.VLookup(Col1, Plage3, 2, False)
Resultat2 = Application.VLookup(Col2, Plage3, 2, False)
Resultat3 = Application.VLookup(Col3, Plage3, 2, False)
Resultat4 = Application.VLookup(Col4, Plage3, 2, False)

RELATIONTEST2 = Application.IfError(Resultat1, Application.IfError(Resultat2, Application.IfError(Resultat3, Application.IfError(Resultat4, "Pas de correspondance"))))
End Function

Merci de votre aide !
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Me suis amusé, sur la base de l'excellent travail de @sylvanu et son fichier du post #10 employé la fonction LET puis en à en faire une Fonction LAMBDA nommée 'RelationDistance'
La fonction LET :
VB:
LET(
Etape1; RECHERCHEX(A3;Feuil2!$A$5:$A$7;Feuil2!$A$5:$D$7;;0;1);
Etape2; EQUIV(Etape1;Feuil3!$A$6:$A$9;0);
Etape3; EQUIV(VRAI;ESTNUM(Etape2);0);
Etape4; INDEX(Etape2;Etape3);
Résultat; INDEX(Feuil3!$B$6:$B$9;Etape4);
Résultat)

Sans let ni lambda en une seule fonction :
=INDEX(Feuil3!$B$6:$B$9;INDEX(EQUIV(RECHERCHEX(A3;Feuil2!$A$5:$A$7;Feuil2!$A$5:$D$7;;0;1);Feuil3!$A$6:$A$9;0);EQUIV(VRAI;ESTNUM(EQUIV(RECHERCHEX(A3;Feuil2!$A$5:$A$7;Feuil2!$A$5:$D$7;;0;1);Feuil3!$A$6:$A$9;0));0)))

Dans cette dernière fonction on devrait pouvoir remplacer la RechercheX par une RechercheV ou un couple Index/Equiv afin qu'elles soit compatible avec les versions antérieures.

Cordialement
 

Pièces jointes

  • LAMBDA RelationDistance.xlsm
    40.2 KB · Affichages: 1
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87