Recherchev, VBE, recherchev polyvalente
Résolu
Humex
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
pierre -
pierre -
Bonjour,
Je travail sur Excel et nécessite d’utiliser une recherchevmulti (c.f. http://www.commentcamarche.net/faq/sujet 12543 vba recherchev polyvalente), je recherche des avis de personnes maîtrisant vraiment Excel.
Le contexte est le suivant :
Ma BD est une extraction de « ciel » (pro logiciel de compta.), l’extraction ressemble à la feuille 1 du fichier mis en lien, avec des numéros de comptes, intitulés, et les débits/crédits. Mon travail consiste à sélectionner seuls certains comptes de la balance et à les éclater sur différents budgets, souvent par domaines (feuille 2).
Le problème : La balance est organisée en domaines et sous domaines. Dans un même domaine on retrouve donc autant de fois que de sous domaines certains numéros de comptes. Une simple RechercheV semble donc être inefficace puisque dans un budget doivent apparaître les sous domaines concernés par un numéro de comptes avec deux débits/crédits différents mais la recherchev donne la même valeur aux deux sous domaines et débits/crédits (feuille 2). J’espère avoir été clair dans mes propos, n’hésitez pas à demander des précisions.
J’ai donc cherché sur ce site une solution et ai trouvé la topique : « [VBA] RechercheV Polyvalente » qui semblait correspondre à mes attentes.
Problème du problème : Une fois copié le code dans le VBE, la fonction ne réagis pas vraiment comme souhaité.
En effet :
=> La fonction créée des doublons ce qui n’est pas le cas dans l’exemple de « [VBA] RechercheV Polyvalente » (feuille 1 et 3)
=>Lorsque la fonction est utilisée pour deux feuilles ou classeurs différents, et qu’ils sont ouverts, alors la fonction bogue, passez de la feuille 1 à 3 et vous verrez qu’elle se met en erreur ou donne des valeurs incohérentes (double cliquez dessus et faites « entée » pour afficher le vrai résultat de la fonction utilisée)
=>La fonction n’est utilisable que sur la feuille ou l’on fait la recherche, si la zone de recherche et la fonction sont sur deux feuilles différentes, alors la fonction ne trouve aucun résultat (feuille 2)
=>La fonction ne réussi pas, dans mon cas, à fonctionner si la cellule de recherche est un nombre tapé à la main, il faut que ce nombre résulte d’un concaténer de deux cellules (feuille 1).
Enfin, j’ai voulu recréer l’exemple de "lermite222" mais le résultat diffère un peu, j’ai des doublons, et ne peut mettre l’ensemble de ma formule en $F$14 (exemple), sinon le résultat reste le même contrairement à "lermite222".
Quelqu’un pourrait-il m’expliquer comment arriver au résultat voulu ou pourrait m’aider à déboguer le VBE.
Je vous remercie d’avance.
Voici le lien pour les exemples : http://www.cijoint.fr/cj200904/cijNN2cVQz.xls
Je travail sur Excel et nécessite d’utiliser une recherchevmulti (c.f. http://www.commentcamarche.net/faq/sujet 12543 vba recherchev polyvalente), je recherche des avis de personnes maîtrisant vraiment Excel.
Le contexte est le suivant :
Ma BD est une extraction de « ciel » (pro logiciel de compta.), l’extraction ressemble à la feuille 1 du fichier mis en lien, avec des numéros de comptes, intitulés, et les débits/crédits. Mon travail consiste à sélectionner seuls certains comptes de la balance et à les éclater sur différents budgets, souvent par domaines (feuille 2).
Le problème : La balance est organisée en domaines et sous domaines. Dans un même domaine on retrouve donc autant de fois que de sous domaines certains numéros de comptes. Une simple RechercheV semble donc être inefficace puisque dans un budget doivent apparaître les sous domaines concernés par un numéro de comptes avec deux débits/crédits différents mais la recherchev donne la même valeur aux deux sous domaines et débits/crédits (feuille 2). J’espère avoir été clair dans mes propos, n’hésitez pas à demander des précisions.
J’ai donc cherché sur ce site une solution et ai trouvé la topique : « [VBA] RechercheV Polyvalente » qui semblait correspondre à mes attentes.
Problème du problème : Une fois copié le code dans le VBE, la fonction ne réagis pas vraiment comme souhaité.
En effet :
=> La fonction créée des doublons ce qui n’est pas le cas dans l’exemple de « [VBA] RechercheV Polyvalente » (feuille 1 et 3)
=>Lorsque la fonction est utilisée pour deux feuilles ou classeurs différents, et qu’ils sont ouverts, alors la fonction bogue, passez de la feuille 1 à 3 et vous verrez qu’elle se met en erreur ou donne des valeurs incohérentes (double cliquez dessus et faites « entée » pour afficher le vrai résultat de la fonction utilisée)
=>La fonction n’est utilisable que sur la feuille ou l’on fait la recherche, si la zone de recherche et la fonction sont sur deux feuilles différentes, alors la fonction ne trouve aucun résultat (feuille 2)
=>La fonction ne réussi pas, dans mon cas, à fonctionner si la cellule de recherche est un nombre tapé à la main, il faut que ce nombre résulte d’un concaténer de deux cellules (feuille 1).
Enfin, j’ai voulu recréer l’exemple de "lermite222" mais le résultat diffère un peu, j’ai des doublons, et ne peut mettre l’ensemble de ma formule en $F$14 (exemple), sinon le résultat reste le même contrairement à "lermite222".
Quelqu’un pourrait-il m’expliquer comment arriver au résultat voulu ou pourrait m’aider à déboguer le VBE.
Je vous remercie d’avance.
Voici le lien pour les exemples : http://www.cijoint.fr/cj200904/cijNN2cVQz.xls
A voir également:
- Recherchev, VBE, recherchev polyvalente
- Recherchev ne renvoie pas la bonne valeur ✓ - Forum Excel
- Si recherchev ✓ - Forum Excel
- Recherchev contient - Forum Excel
- Recherchev et rechercheh combiné ✓ - Forum Excel
- Si ma cellule contient du texte alors rien sinon recherchev - Forum Excel
11 réponses
Bonsoir,
Je me suis penché sur le problème qui n'est pas simple. J'ai trouvé deux problèmes dans l'application de la macro de Lermite222 qui dans ce cas d'utilisation ne pouvait pas fonctionner correctement.
1/ la macro initiale supposait qu'elle est une fonction du classeur courant car il y avait un test sur la formule qui ne marche pas si la macro est préfixée par un nom de fichier. J'ai simplifié le test cherchant tout simplement les lignes contenants une macro identique.
2/ la macro initiale supposait que tout se passait dans la même feuille. J'ai préfixé par le nom de la bonne feuille toutes les cellules.
Il faut donc bien voir le principe d'utilisation. Les trois paramètres sont trois cellules (inutile de mettre des plages). Et il faut dupliquer la formule à l'identique (en utilisant la syntaxe $) pour obtenir les occurences différentes.
Donc voila la macro transformée qui devrait marcher (avec mes excuses à Lermitte d'avoir un peu adapté son excellent travail)
A+
Je me suis penché sur le problème qui n'est pas simple. J'ai trouvé deux problèmes dans l'application de la macro de Lermite222 qui dans ce cas d'utilisation ne pouvait pas fonctionner correctement.
1/ la macro initiale supposait qu'elle est une fonction du classeur courant car il y avait un test sur la formule qui ne marche pas si la macro est préfixée par un nom de fichier. J'ai simplifié le test cherchant tout simplement les lignes contenants une macro identique.
2/ la macro initiale supposait que tout se passait dans la même feuille. J'ai préfixé par le nom de la bonne feuille toutes les cellules.
Il faut donc bien voir le principe d'utilisation. Les trois paramètres sont trois cellules (inutile de mettre des plages). Et il faut dupliquer la formule à l'identique (en utilisant la syntaxe $) pour obtenir les occurences différentes.
Donc voila la macro transformée qui devrait marcher (avec mes excuses à Lermitte d'avoir un peu adapté son excellent travail)
Option Explicit 'RD =cellule où commencer la recherche 'RC = cellule critère 'RDT = cellule où cherche la donnée 'Ligne rechercher jusque ligne... (optional) si 0 cherche jusqu'au bout de la ligne Public Function RechercheVmulti(RD As Range, RC As Range, RDT As Range, _ Optional Ligne As Long = 0) Dim i As Integer, e As Integer, Txt As String Dim LigE As Long, ColE As Long 'où écrire résultats Dim Col As Integer Dim Lig As Long, Occ As Long Dim FeuilE As String, FeuilRD As String, FeuilRDT As String On Error GoTo sortie LigE = Application.Caller.Row ColE = Application.Caller.Column FeuilE = Application.Caller.Parent.Name Application.Volatile Lig = RD.Row ' Ligne où commencer la recherche Col = RD.Column 'Colonne où commencer la recherche FeuilRD = RD.Parent.Name FeuilRDT = RDT.Parent.Name If Ligne = 0 Then Ligne = Range(Sheets(FeuilRD).Cells(65536, Col), Sheets(FeuilRD).Cells(65536, Col)).End(xlUp).Row End If 'Recherche le numéro de l'occurrence à trouver For Occ = LigE - 1 To 1 Step -1 Txt = Sheets(FeuilE).Cells(Occ, ColE).Formula If Txt = Sheets(FeuilE).Cells(LigE, ColE).Formula Then e = e + 1 End If Next Occ For i = Lig To Ligne If Sheets(FeuilRD).Cells(i, Col) = RC Then If e <> 0 Then e = e - 1 Else RechercheVmulti = Sheets(FeuilRDT).Cells(i, RDT.Column) Exit Function End If End If Next i 'Si plus trouver de concordance RechercheVmulti = "" Exit Function sortie: 'si erreur dans la formule, non détectée par Excel. RechercheVmulti = "#FAUTE!" End Function
A+
Bonjour,
Je tiens à vous remercier pour le délai avec lequel vous m'avez répondu, et m'excuser pour le mien.
J'ai trouvé une solution en utilisant une autre macro qui fonctionne parfaitement. Le problème est donc résolu et je peux, si quelqu'un le souhaite, poster cette nouvelle formule.
Je tiens à remercier Lermitte pour son travail ainsi que Pilas31 pour les rectifications et pour m'avoir répondu.
Veuillez agréer Messieurs, mes salutations distinguées.
PS: Si j'avais à poster la macro que j'utilise actuellement, je m'efforcerais de donner le lien du site sur lequel je l'ai trouvée; je ne suis pas doué en VBA et je ne tiens pas à m'attribuer le travail d'un autre et serais incapable ou presque de répondre aux questions et problèmes rencontrés par d'autres utilisateurs avec cette macro.
Je tiens à vous remercier pour le délai avec lequel vous m'avez répondu, et m'excuser pour le mien.
J'ai trouvé une solution en utilisant une autre macro qui fonctionne parfaitement. Le problème est donc résolu et je peux, si quelqu'un le souhaite, poster cette nouvelle formule.
Je tiens à remercier Lermitte pour son travail ainsi que Pilas31 pour les rectifications et pour m'avoir répondu.
Veuillez agréer Messieurs, mes salutations distinguées.
PS: Si j'avais à poster la macro que j'utilise actuellement, je m'efforcerais de donner le lien du site sur lequel je l'ai trouvée; je ne suis pas doué en VBA et je ne tiens pas à m'attribuer le travail d'un autre et serais incapable ou presque de répondre aux questions et problèmes rencontrés par d'autres utilisateurs avec cette macro.
Bonjour,
Je suis intéressée par la solution, étant confrontée au même cas de figure. Ou alors un lien vers la macro que tu as utilisé?
PS: participant régulièrement à des forums, je constate qu'il vaut toujours mieux laisser la solution quand le problème est résolu. Rien de plus frustrant que de voir quelqu'un qui a eu le même problème et l'a résolu sans dire comment. A savoir que les forums restent en ligne, alors qu'il peut être difficile de recontacter un utilisateur 5 ans après ;-)
Merci d'avance!
Je suis intéressée par la solution, étant confrontée au même cas de figure. Ou alors un lien vers la macro que tu as utilisé?
PS: participant régulièrement à des forums, je constate qu'il vaut toujours mieux laisser la solution quand le problème est résolu. Rien de plus frustrant que de voir quelqu'un qui a eu le même problème et l'a résolu sans dire comment. A savoir que les forums restent en ligne, alors qu'il peut être difficile de recontacter un utilisateur 5 ans après ;-)
Merci d'avance!
Bonjour,
Je ne sais pas si Humex est toujours sur le forum mais je te donne le lien de l'astuce dont je parle dans mon post initialement imaginée par Lermitte222 et à laquelle j'ai apporté quelques petites améliorations.
https://www.commentcamarche.net/faq/12543-vba-recherchev-polyvalente
Peut-être qu'elle répond à ton problème.
Si elle ne répond pas n'hésites pas à ouvrir une autre discussion en exposant ton problème et éventuellement en mettant dans Cijoint une exemple de ton fichier.
A+
Je ne sais pas si Humex est toujours sur le forum mais je te donne le lien de l'astuce dont je parle dans mon post initialement imaginée par Lermitte222 et à laquelle j'ai apporté quelques petites améliorations.
https://www.commentcamarche.net/faq/12543-vba-recherchev-polyvalente
Peut-être qu'elle répond à ton problème.
Si elle ne répond pas n'hésites pas à ouvrir une autre discussion en exposant ton problème et éventuellement en mettant dans Cijoint une exemple de ton fichier.
A+
Merci pour ta réponse.
Oui j'avais déjà été voir ce lien, mais la macro "modifiée" que tu avais ensuite posté était exactement la même.
Ou alors la macro que tu as modifié a remplacé sur le lien celle d'origine?
En fait je cherche aussi à pouvoir traiter sur une feuille des données d'autres feuilles.
Est-ce que c'est ce que fait
Si oui, pourquoi un appel avec RD sous la forme
Oui j'avais déjà été voir ce lien, mais la macro "modifiée" que tu avais ensuite posté était exactement la même.
Ou alors la macro que tu as modifié a remplacé sur le lien celle d'origine?
En fait je cherche aussi à pouvoir traiter sur une feuille des données d'autres feuilles.
Est-ce que c'est ce que fait
RD.Parent.Name?
Si oui, pourquoi un appel avec RD sous la forme
RechercheVmulti(feuille!$A$2,!ESTVIDE,feuille!$H$2)me donne une erreur?
Quel est la signification de !ESTVIDE . Car cet argument de la fonction est censé être une cellule qui contient le critère de selection.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re ,
Je te propose les modifs suivantes :
Je te propose les modifs suivantes :
'RD =cellule où commencer la recherche 'RDT = cellule où chercher la donnée 'Ligne rechercher jusque ligne... (optional) si 0 cherche jusqu'au bout de la ligne Public Function RechercheVmultiVide(RD As Range, RDT As Range, _ Optional Ligne As Long = 0) Dim i As Integer, e As Integer, Txt As String Dim LigE As Long, ColE As Long 'où écrire résultats Dim Col As Integer Dim Lig As Long, Occ As Long Dim FeuilE As Worksheet, FeuilRD As Worksheet, FeuilRDT As Worksheet On Error GoTo sortie LigE = Application.Caller.Row ColE = Application.Caller.Column Set FeuilE = Application.Caller.Parent Application.Volatile Lig = RD.Row ' Ligne où commencer la recherche Col = RD.Column 'Colonne où commencer la recherche Set FeuilRD = RD.Parent Set FeuilRDT = RDT.Parent If Ligne = 0 Then Ligne = Range(FeuilRD.Cells(65536, Col), FeuilRD.Cells(65536, Col)).End(xlUp).Row End If 'Recherche le numéro de l'occurrence à trouver For Occ = LigE - 1 To 1 Step -1 Txt = FeuilE.Cells(Occ, ColE).Formula If Txt = FeuilE.Cells(LigE, ColE).Formula Then e = e + 1 End If Next Occ For i = Lig To Ligne If FeuilRD.Cells(i, Col) = "" Then 'RC Then If e <> 0 Then e = e - 1 Else RechercheVmultiVide = FeuilRDT.Cells(i, RDT.Column) Exit Function End If End If Next i 'Si plus trouvé de concordance RechercheVmultiVide = "" Exit Function sortie: 'si erreur dans la formule, non détectée par Excel. RechercheVmultiVide = "#FAUTE!" End Function
OK donc,
ligne 37 de la macro, je remplace par
Du coup je dégage l'argument RC de la fonction.
La formule est acceptée, j'ai maintenant une erreur #NOM, mais je sens qu'on se rapproche du but!
ligne 37 de la macro, je remplace par
If Sheets(FeuilRD).Cells(i, Col) <> Empty Then
Du coup je dégage l'argument RC de la fonction.
La formule est acceptée, j'ai maintenant une erreur #NOM, mais je sens qu'on se rapproche du but!
Attention, regarde la dernière fonction que j'ai proposé elle est plus recente et les déclarations de feuilles sont différentes :
Dim FeuilE As Worksheet, FeuilRD As Worksheet, FeuilRDT As Worksheet
et ne sont plus utilisées comme des nom de feuilles.
Lors d'une discussion ultèrieure j'avais corrigé cet aspect. Peut-être que tu as des problèmes à cause de ça...
Dim FeuilE As Worksheet, FeuilRD As Worksheet, FeuilRDT As Worksheet
et ne sont plus utilisées comme des nom de feuilles.
Lors d'une discussion ultèrieure j'avais corrigé cet aspect. Peut-être que tu as des problèmes à cause de ça...
Bonjour,
J'ai simulé exactement le même appel (avec un ; à la place de ,) et ça fonctionne parfaitement.
Si tu as toujours le même problème, tu peux peut-être mettre ton fichier (edulcoré) sur cijoint.fr pour que je le regarde..
J'ai simulé exactement le même appel (avec un ; à la place de ,) et ça fonctionne parfaitement.
='Facture 1.xls'!RechercheVmulti(feuille1!$A$2;feuille2!$H$2)
Si tu as toujours le même problème, tu peux peut-être mettre ton fichier (edulcoré) sur cijoint.fr pour que je le regarde..
bonjour a tous,
vos codes sont très interessant mais je souhaiterais savoir si il etait possible d'avoir les resultats de la fonction recherchevmulti sous la forme d'une liste plutot que les resultat soient les un en dessous des autres ?
Merci d'avance
vos codes sont très interessant mais je souhaiterais savoir si il etait possible d'avoir les resultats de la fonction recherchevmulti sous la forme d'une liste plutot que les resultat soient les un en dessous des autres ?
Merci d'avance
Bonjour,
Si la question consiste à avoir les résultats dans une même cellule avec un séparateur (virgule par exemple), le problème est beaucoup plus simple. Voici une fonction qui fait cela :
A tester
Si la question consiste à avoir les résultats dans une même cellule avec un séparateur (virgule par exemple), le problème est beaucoup plus simple. Voici une fonction qui fait cela :
'RD = Plage de cellules ou rechercher 'RC = cellule qui contient le critère 'ColRes = N°Colonne ou se trouve le résultat Public Function RechercheDonneListe(RD As Range, RC As Range, ColRes As Integer) As String Dim CelCou As Range Dim ListeResult As String For Each CelCou In RD If CelCou.Value = RC.Value Then If ListeResult <> "" Then ListeResult = ListeResult & " , " ListeResult = ListeResult & Cells(CelCou.Row, ColRes) End If Next CelCou RechercheDonneListe = ListeResult End Function
A tester
Je relance le topic car je suis intéressée pour exploiter cette macro en important des données de feuilles différentes.
J'ai beau relire et comparer la macro d'origine et celle modifiée, je ne vois aucune différence... Serait-ce un problème de copié-collé?
Merci d'avance :)