Recherchev, VBE, recherchev polyvalente

Résolu/Fermé
Humex Messages postés 2 Date d'inscription mercredi 22 avril 2009 Statut Membre Dernière intervention 23 avril 2009 - 23 avril 2009 à 09:27
 pierre - 29 juin 2015 à 17:39
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

11 réponses

pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
24 avril 2009 à 02:30
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)

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+
0
Bonjour,

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 :)
0
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.
0
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!
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
19 janv. 2010 à 13:42
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+
0
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
 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?
0
gigiu > gigiu
19 janv. 2010 à 15:48
avec des ";" en fait (mais ça ne marche toujours pas, c'eût été trop facile!)
RechercheVmulti(feuille!$A$2;!ESTVIDE;feuille!$H$2)
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643 > gigiu
19 janv. 2010 à 15:57
Re,

Je regarde car il y a un petit moment que je n'ai pas utilisé cette fonction et je crois que lors d'une discussion ultérieure j'ai proposé d'autres améliorations (qui ne sont pas dans l'astuce) ...

Je cherche et je reviens...
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
19 janv. 2010 à 16:37
Quel est la signification de !ESTVIDE . Car cet argument de la fonction est censé être une cellule qui contient le critère de selection.
0
je voudrais ne prendre en compte que les cellules qui contiennent quelques chose, donc dont le contenu est différent de ESTVIDE (qui existe par défaut dans Excel je pense?).

Je n'avais pas pensé que la macro n'est peut etre pas adapté pour ça, je regarde aussi.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
19 janv. 2010 à 17:06
Re ,

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
0
OK donc,

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!
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
19 janv. 2010 à 17:17
Oui tu as raison j'avais modifié à l'envers en mettant ="" au lieu de <> "" ou Empty ...
Chez moi ça marche mais j'ai tout dans le même classeur...
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
19 janv. 2010 à 17:22
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...
0
Salut pilas31,

C'est corrigé! Bon j'ai toujours une erreur #NOM... J'utilise des feuilles différentes dans un même classeur.
Tu pourrais me copier un exemple d'appel de la fonction? Si ça tombe c'est juste ça!

Moi je met
='Factures 1.xls'!RechercheVmulti(feuille1!$A$2,feuille2!$H$2)
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
20 janv. 2010 à 10:36
Bonjour,

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..

0
Bonjour Pilas,

J'ai tout repris du début en commençant avec un fichier vierge, et il faut croire qu'il y avait des résidus sur l'autre classeur puisque ça a marché du premier coup!

Je te remercie pour ton aide,

Gigiu
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643 > gigiu
25 janv. 2010 à 14:46
Bonjour,

Avec plaisir, je passe la discussion en résolu.

Bonne continuation.
0
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
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
3 déc. 2014 à 16:47
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 :
'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
0
Bonjour

en faite j'aimerais que les résultat

Dim LigE As Long, ColE As Long 'où écrire résultats

sois sur une ligne dans plusieurs colonne et pas en colonne sur plusieurs Ligne
je ne vois pas quoi modifier?
0