RechercheV sur 2 critères
Résolu/Fermé
crouba33
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020
-
10 déc. 2020 à 18:07
Raymond PENTIER Messages postés 58731 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 23 novembre 2024 - 11 déc. 2020 à 18:08
Raymond PENTIER Messages postés 58731 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 23 novembre 2024 - 11 déc. 2020 à 18:08
A voir également:
- RechercheV sur 2 critères
- 2 ecran pc - Guide
- Word numéro de page 1/2 - Guide
- 2 comptes whatsapp - Guide
- 3 bip long 2 bip court hp - Forum BIOS
- Comment brancher 2 tv sur un seul décodeur sans payer - Forum Matériel & Système
7 réponses
DjiDji59430
Messages postés
4148
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
23 novembre 2024
678
10 déc. 2020 à 19:10
10 déc. 2020 à 19:10
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
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
ptitpanda
Messages postés
65
Date d'inscription
dimanche 5 août 2012
Statut
Membre
Dernière intervention
8 avril 2023
8
10 déc. 2020 à 20:09
10 déc. 2020 à 20:09
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
A adapter aux colonnes que tu souhaites mettre à jour.
Bonne soirée
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
crouba33
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020
11 déc. 2020 à 11:19
11 déc. 2020 à 11:19
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
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
Raymond PENTIER
Messages postés
58731
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
23 novembre 2024
17 243
11 déc. 2020 à 13:59
11 déc. 2020 à 13:59
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
crouba33
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020
11 déc. 2020 à 15:02
11 déc. 2020 à 15:02
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
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
ALS35
Messages postés
1033
Date d'inscription
jeudi 18 juillet 2019
Statut
Membre
Dernière intervention
9 janvier 2024
139
11 déc. 2020 à 17:18
11 déc. 2020 à 17:18
Bonjour,
Si j'ai bien compris, une proposition si tu veux trouver l'information Licence par exemple, en B2 de ta feuille base :
Formule matricielle à valider par Ctrl+Maj+Entrée, elle se met alors automatiquement entre accolades {}.
À adapter pour les autres colonnes
Cordialement
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
crouba33
Messages postés
9
Date d'inscription
mardi 1 décembre 2020
Statut
Membre
Dernière intervention
23 décembre 2020
11 déc. 2020 à 18:04
11 déc. 2020 à 18:04
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
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
Raymond PENTIER
Messages postés
58731
Date d'inscription
lundi 13 août 2007
Statut
Contributeur
Dernière intervention
23 novembre 2024
17 243
11 déc. 2020 à 18:08
11 déc. 2020 à 18:08
J'en suis très heureux pour toi.
Je finirai par me mettre à VBA, moi aussi, un jour prochain ...
Je finirai par me mettre à VBA, moi aussi, un jour prochain ...