Recherchev, VBE, recherchev polyvalente

Résolu
Humex Messages postés 2 Statut Membre -  
 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
Configuration: Windows XP
Internet Explorer 6.0

11 réponses

  1. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. gigiu
       
      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
  2. Humex
     
    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
    1. gigiu
       
      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
  3. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. gigiu
       
      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
      1. gigiu > gigiu
         
        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
      2. pilas31 Messages postés 1878 Statut Contributeur 648 > gigiu
         
        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
  4. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. gigiu
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
  7. gigiu
     
    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
    1. pilas31 Messages postés 1878 Statut Contributeur 648
       
      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
  8. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. gigiu
       
      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
  9. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
    1. gigiu
       
      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
      1. pilas31 Messages postés 1878 Statut Contributeur 648 > gigiu
         
        Bonjour,

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

        Bonne continuation.
        0
  10. fredoalex
     
    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
  11. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
  12. pierre
     
    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