RechercheV sur 2 critères

Résolu
Bonsoir,

Malgré mes recherches, qui m'ont amené sur de vieux échanges sur ce sujet, je n'ai pas réussi à en tirer une solution à mon problème.
La situation :
j'ai un classeur, 2 feuilles A et B
  • Sur feuille A j'ai un listing avec en colonne 1 le "NOM PRENOM" et plusieurs colonnes avec des données relatives à "NOM PRENOM"
  • Sur feuilles B j'ai un listing avec en col1 Prenom, col2 Nom et plusieurs colonnes avec des données.....CETTE FEUILLE EST MISE A JOUR PAR LIEN avec Sheet publiée sur le web. Je ne veux pas modifier sa structure pour ne pas boguer lors de mises à jour. Elle ne contient pas tous les noms de la feuille A

Le problème vous l'aurez compris :
mettre à jour les données en feuille A à partir d'une recherche de "Nom Prenom" dans la matrice de feuille B et correspondant à la concaténation de col2 (Nom) et col1 (Prenom).
Exemple :
J'ai sur feuille A en col1 DUVAL Pierre et col3 05 55 55 55 55
J'ai sur feuille B en
ligne 2 col1Jacques col2 DUVAL col5 05 54 54 54 54
ligne 3 col1 Pierre col2 DUVAL et col5 05 55 55 55 56
Comment trouve le bon n° de téléphone ?

Je suis preneur d'une fx type RECHERCHEV, mais l'idéal serait un une bout de code VBA.
Avec un application.match par exemple dans une boucle qui vérifierait chaque ligne de A en comparaison avec les lignes de B.

J'espère avoir été suffisamment clair pour espérer quelques réponses, voir pistes, pour lesquelles je vous remercie par avance

Claude

7 réponses

  1. Bonjour,

    Un fichier EXCEL (test ou non), complété par des explications exhaustives et des exemples remplis à la main, mis sur https://www.cjoint.com/ permettrait aux intervenants de répondre plus précisément à ta question. Et précise aussi ta version d'Excel, si ce n'est déjà fait.

    Crdmt
    0
    1. Bonjour,

      Je tente une réponse car j'avais commencé à réfléchir dessus avant le post de DjiDji59430, mais c'est vrai que comme il dit : c'est bien mieux avec un p'tit fichier joint pour comprendre les demandes.

      Essaye ce bout de code mais si ce n'est pas ça, met un fichier sur Cjoint
      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim personne As String
      
      With Worksheets("feuil2")
              personne = .Cells(Target.Row, 2) & " " & .Cells(Target.Row, 1)
              Set rech = Worksheets("Feuil1").Cells.Find(personne)
              If Not rech Is Nothing Then 's'il trouve une correspondance
                  Worksheets("Feuil1").Cells(rech.Row, 2) = .Range("c" & Target.Row)
                  Exit Sub
              End If
      End With
      
      End Sub


      A adapter aux colonnes que tu souhaites mettre à jour.

      Bonne soirée
      0
      1. Bonjour,
        Merci pour ces premières réactions.
        Je vais tester le bout de code de ptipanda que je remercie et afin de donner plus de visibilité sur ma demande et comme le dit très justement djidji59430 avec un exemple cela peut être mieux. Je partage donc le fichier exemple ci joint. Tous les noms sont vrais mais j'ai supprimé les données sensibles.
        L'objectif est d'actualiser les informations de chaque membre.
        Je compare la valeur de la colonne A dans Base-vadrouilleurs avec les colonnes last-name et first-name de Gsheet. Si la concordance est trouvée, je récupère les données correspondantes et les insère dans leur colonne respective de Base_vadrouilleurs.
        J'ai écrit ce début de bout de code qui fonctionne bien, mais le problème est que lorsque j'ai un homonyme, la boucle s'arrêtant toujours sur la première occurrence trouvée sur Gsheet Var prend toujours la même valeur puisque je match uniquement sur le nom. Il faut bien que je puisse matcher sur "last-name et first-name" pour avoir la concordance exacte. Et je ne trouve pas la solution.

        ----------------------------------------------------------------------------------------------------------------------------------------------

        ' détermine le nbre de lignes à analyser
        iRowL0 = Sheets("Gsheet").UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
        iRowL = Sheets("Base_Vadrouilleurs").UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
        isheet.Select
        ' pour chaque ligne de Gsheet: définit la valeur recherchée pour affecter à chaque correspondance les valeurs du tableau dans Base_vadrouilleurs
        For iRow = 1 To iRowL
        ' extraction du nom de famille
        With Cells(iRow + 1, 1)
        lg = Len(.Value) ' détermine la longueur de la chaîne de caractère
        chaine = .Value ' définit la chaîne
        larray = Split(chaine, " ") ' extrait chaque section de chaine séparée par un blanc
        lgprenom = Len(larray(UBound(larray))) ' calcule le nbre de lettre du dernier mot de la chaîne
        Prenom = larray(UBound(larray))
        Nom = Mid(.Value, 1, lg - (lgprenom + 1)) ' extrait le nom à rechercher
        End With

        bln = False
        var = Application.Match(Nom, Sheets("Gsheet").Columns(6), 0) '----renvoi une valeur de ligne si trouvé ou non----
        If Not IsError(var) Then ' vérifie l'existance du nom
        nm = Sheets("Gsheet").Cells(var, 6).Value 'on passe par une variable pour mettre le nom en capitales
        vartofind = UCase(nm) & " " & Sheets("Gsheet").Cells(var, 5).Value
        If vartofind = chaine Then
        bln = True
        MsgBox vartofind
        Exit For ' sort de la boucle
        End If

        Else
        bln = False
        End If
        Next iRow ' passe à la ligne suivante
        -----------------------------------------------------------------------------------------------------------------------------------------------
        https://onedrive.live.com/redir?resid=AB623876A4E21FDD!5914&authkey=!AEukorA3mMKwxzA&ithint=file%2cxlsx&e=m6bXod
        ou
        https://www.cjoint.com/c/JLlkrR4Bzfy

        Je reste à l'écoute
        0
        1. Contributeur
          Bonjour Claude.

          Tu ne peux effectivement pas faire une recherche avec en A de la feuille Base le NOM Prénom, alors que dans la feuille Gsheet tu as les prénoms en E et les noms en F !
          Donc la première chose à faire est d'ajouter en N3 la concaténation NOM + Prénom et de mettre en O3 la formule de recherche.
          Si tu veux rapatrier la donnée en L3, tu y saisis la formule =SIERREUR(O3;"inconnu")
          https://www.cjoint.com/c/JLlm6quehpU
          0
          1. Merci Raymond

            L'idée est intéressante, mais ne va pas dans le sens que je recherche. Ce sont les données de Table_0 (Gsheet) que je souhaite intégrer dans Tableau3(Base_) .
            D'autre part, je préfère ne pas trop toucher à la feuille Gsheet qui est mise à jour automatiquement avec une requête sur Google Sheet. Et les requêtes de liaison aiment bien retrouver la structure d'origine à chaque mise à jour.
            Mais je retiens deux choses : l'utilisation de [@xxxx] et le rappel de SIERREUR.
            Claude
            0
            1. Bonjour,

              Si j'ai bien compris, une proposition si tu veux trouver l'information Licence par exemple, en B2 de ta feuille base :
              =SIERREUR(INDEX(Table_0[Column10];EQUIV([@[Nom Prénom]];Table_0[Column6]&" "&Table_0[Column5];0));"")

              Formule matricielle à valider par Ctrl+Maj+Entrée, elle se met alors automatiquement entre accolades {}.
              À adapter pour les autres colonnes

              Cordialement
              0
          2. Il y a quelques lustres, un prof m'avait dit si tu ne sais pas trouver un mot pour traduire ta phrase, essaye d'utiliser d'autres mots pour exprimer la même chose.
            C'est en lisant la réponse de Raymond que j'ai trouvé la solution. Au lieu de partir de ma feuille Base_, je parts de la feuille Gsheet. Si je trouve sur Base_ ce que j'ai sur Gsheet je mets à jour les correspondances. Si je ne trouve pas, alors je créé l'occurrence. Ce qui donne le code:

            Private Sub MaJ_en_Bloc()

            ' définition des variables de nom, du nombre de lignes et colonnes

            Set isheet_0 = Sheets("Base_vadrouilleurs")
            Set isheet_1 = Sheets("Gsheet")

            Dim nom As String, prnom As String

            iRowL0 = isheet_1.UsedRange.Rows(isheet_1.UsedRange.Rows.Count).Row
            iRowL = isheet_0.UsedRange.Rows(isheet_0.UsedRange.Rows.Count).Row
            nbcol = isheet_0.UsedRange.Columns(isheet_0.UsedRange.Columns.Count).Column

            ' définition de la valeur à rechercher
            For iRow = 3 To iRowL0
            nom = isheet_1.Cells(iRow, 6).Value
            prnom = isheet_1.Cells(iRow, 5).Value
            vartofind = UCase(nom) & " " & prnom
            ' recherche
            var = Application.Match(vartofind, isheet_0.Columns(1), 0) ' affiche le n° de ligne correspondant à la valeur recherchée
            If Not IsError(var) Then
            ' affectation des valeurs correspondantes de la ligne trouvée
            For col = 2 To nbcol
            Cells(var, col).Value = isheet_1.Cells(iRow, col + 5).Value
            Next
            Else
            GoTo erreur ' sera remplacé par l'appel à une procédure de création du membre
            End If

            erreur:
            Next

            End Sub

            et ça marche

            Merci pour votre aide
            0
            1. Contributeur
              J'en suis très heureux pour toi.
              Je finirai par me mettre à VBA, moi aussi, un jour prochain ...
              0