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. Contributeur
    J'en suis très heureux pour toi.
    Je finirai par me mettre à VBA, moi aussi, un jour prochain ...
    0
    1. 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. 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. 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. 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. 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,

              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