RechercheV sur 2 critères [Résolu]

Signaler
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020
-
Messages postés
53111
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
19 janvier 2021
-
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

Messages postés
2962
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
18 janvier 2021
411
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
Messages postés
54
Date d'inscription
dimanche 5 août 2012
Statut
Membre
Dernière intervention
4 janvier 2021
6
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
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020

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
Messages postés
53111
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
19 janvier 2021
15 082
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
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020

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
Messages postés
583
Date d'inscription
jeudi 18 juillet 2019
Statut
Membre
Dernière intervention
15 janvier 2021
34
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
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020

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
Messages postés
53111
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
19 janvier 2021
15 082
J'en suis très heureux pour toi.
Je finirai par me mettre à VBA, moi aussi, un jour prochain ...