VBA RechercheV avec x retour
Dernière réponse : dans Programmation
Bonsoir le forum, je souhaite faire une boucle sur rechercheV, je m'explique:
j'ai une macro qui fait une rechercheV d'une feuille vers une autre (pas de problème). Où ça se complique, c'est que je souhaite boucler sur cette recherche, c'est à dire que tant que la valeur cherchée ex: a1 de la feuil1 dans G1:H de la feuil2 trouve des résultats, je renseigne en B,x de la feuil1 en insérant à chaque fois une ligne sur la feuil1. Dès que la boucle est teminée, je passe en A? suivant le nombre de recherches trouvées. Je ne sais pas si celà est possible.
Merci de votre aide. Mon code que j'ai commencé à écrire, mais qui me renvoi seulement la première cellule trouvée.
A bientôt.
Sub test()
Set plage = Sheets("5-17").Range("G2:T" & Sheets("5-9-12").Range("I65536").End(xlUp).Row)
'Range("j2:j65536").ClearContents 'précaution...
For Each cel In Range("i2", Range("i65536").End(xlUp))
cel.Offset(, 1) = Application.VLookup(cel, plage, 14, 0)
Next
End Sub
j'ai une macro qui fait une rechercheV d'une feuille vers une autre (pas de problème). Où ça se complique, c'est que je souhaite boucler sur cette recherche, c'est à dire que tant que la valeur cherchée ex: a1 de la feuil1 dans G1:H de la feuil2 trouve des résultats, je renseigne en B,x de la feuil1 en insérant à chaque fois une ligne sur la feuil1. Dès que la boucle est teminée, je passe en A? suivant le nombre de recherches trouvées. Je ne sais pas si celà est possible.
Merci de votre aide. Mon code que j'ai commencé à écrire, mais qui me renvoi seulement la première cellule trouvée.
A bientôt.
Citation :
Sub test()
Set plage = Sheets("5-17").Range("G2:T" & Sheets("5-9-12").Range("I65536").End(xlUp).Row)
'Range("j2:j65536").ClearContents 'précaution...
For Each cel In Range("i2", Range("i65536").End(xlUp))
cel.Offset(, 1) = Application.VLookup(cel, plage, 14, 0)
Next
End Sub
Autres pages sur : vba recherchev retour
Lassé par la pub ? Créez un compte
Merci.
Ben c'est pas plus clair ! Ce qui m'embête, c'est que je vois du code assez bien écrit mais inutile
Pourquoi définis-tu plage par exemple ? Pis je vois pas le rapport entre ton code et ton explication. Cela dit, c'est surtout que je n'ai pas trop compris ton laïus. A partir de là, deux possibilités, soit je relis mieux, soit tu ré-expliques mieux. (J'ai une nette préférence pour la seconde solutions.)
Bon, partons du principe qu'une ré-explication est la meilleure solution. Je te propose d'y allez par étape : un gros problème se résout facilement si on peut le découper en petits problèmes.
Merki. Ma journée sera encore meilleure quand tu auras une soluce
Ben c'est pas plus clair ! Ce qui m'embête, c'est que je vois du code assez bien écrit mais inutile
Pourquoi définis-tu plage par exemple ? Pis je vois pas le rapport entre ton code et ton explication. Cela dit, c'est surtout que je n'ai pas trop compris ton laïus. A partir de là, deux possibilités, soit je relis mieux, soit tu ré-expliques mieux. (J'ai une nette préférence pour la seconde solutions.)
Bon, partons du principe qu'une ré-explication est la meilleure solution. Je te propose d'y allez par étape : un gros problème se résout facilement si on peut le découper en petits problèmes.
Citation :
Bonne journée.
Resalut Zeb, je réexplique :
Via une macro, je me posisionne en en "J2" sur la feuille "5-9-12". Je cherche la valeur de I2 de cette feuille, dans la feuille "5-17" sur les colonnes "G:T". Si une valeur de Ix de la feuille "5-9-12" est trouvée dans la colonn G de la feuille "5-17" je renvoi la première valeur de la colonne "T". Jusque la pas de problème.
Le problème est que dans la feuille "5-17" colonne "G" je peux avoir 1 ou 2,3,4 valeurs. Donc je souhaiterais une fois une valeur trouvé bouclé sur la colonne "G" et si je trouve une nouvelle fois la valeur, j'insère une ligne sur la feuille "5-9-12" et je renseigne Jx+1 de la valeur trouvée en "T".
J'espère que c'est plus clair.
A bientôt.
Via une macro, je me posisionne en en "J2" sur la feuille "5-9-12". Je cherche la valeur de I2 de cette feuille, dans la feuille "5-17" sur les colonnes "G:T". Si une valeur de Ix de la feuille "5-9-12" est trouvée dans la colonn G de la feuille "5-17" je renvoi la première valeur de la colonne "T". Jusque la pas de problème.
Le problème est que dans la feuille "5-17" colonne "G" je peux avoir 1 ou 2,3,4 valeurs. Donc je souhaiterais une fois une valeur trouvé bouclé sur la colonne "G" et si je trouve une nouvelle fois la valeur, j'insère une ligne sur la feuille "5-9-12" et je renseigne Jx+1 de la valeur trouvée en "T".
J'espère que c'est plus clair.
A bientôt.
Bon. J'ai l'impression que tu cherches à m'embrouiller : Tu ne cherches pas dans G:T mais dans G. C'est bien ça ? Et quand tu l'as trouvé, tu l'a copies où ? Dans la feuille 5-5678-123 ? Pis pourquoi tu parles de J2 puisqu'après tu ne parles plus que de Ix ?
Etudie ce code :
Si tu as compris, tu auras soit la solution à ton problème (
) soit tu auras compris que je ne t'ai toujours pas compris. Et là : il faudra encore réexpliquer ....
Mais en plus compréhensible (
)
Etudie ce code :
Si tu n'as pas compris, réétudie-le.
Dim ws_srce_1 As Worksheet '// Source #1 Dim ws_srce_2 As Worksheet '// Source #2 Dim ws_target As Worksheet '// Cible Dim cell_s1 As Range Dim cell_s2 As Range Dim cell_tg As Range Dim zone_s1 As Range Dim zone_s2 As Range Set ws_srce_1 = Worksheets("5-9-12") Set ws_srce_2 = Worksheets("5-17") Set ws_target = Worksheets("5-5678-123") ' // On positionne la cible sur la dernière ligne vide. ' // Le fait que la feuillec puisse être complètement vide est géré ' // La référence est la colonne 1 - à adapter. Set cell_tg = ws_target.Range("A65536").End(xlUp) If cell_tg.Text <> "" Then Set cell_tg = cell_tg.Offset(1) ' // Les valeurs à chercher sont dans la colonne I Set zone_s1 = ws_srce_1.Range(ws_srce_1.Range("I1"), _ ws_srce_1.Range("I65536").End(xlUp)) ' // Les valeurs à trouver sont dans la colonne G Set zone_s2 = ws_srce_2.Range(ws_srce_2.Range("G1"), _ ws_srce_2.Range("G65536").End(xlUp)) For Each cell_s1 In zone_s1 For Each cell_s2 In zone_s2 If cell_s1.Value = cell_s2.Value Then ' // Trouvé ! On copie de la source 2 vers la cible cell_s2.EntireRow.Copy Destination:=cell_tg Set cell_tg = cell_tg.Offset(1) End If Next Next
Si tu as compris, tu auras soit la solution à ton problème (
) soit tu auras compris que je ne t'ai toujours pas compris. Et là : il faudra encore réexpliquer ....
Mais en plus compréhensible (
)
Bonsoir zeb, je pense que l'on ne va pas y arriver. Je ne comprends pas la ligne 13. Je réexplique:
Ix est en feuille "5-9-12"
Jx est en feuille "5-9-12"
Gy est en feuille "5-17"
Ty est en feuille "5-17"
Si valeur(Ix) = valeur(Gy) je renvoie Ty en Jx ensuite je boucle
Si valeur(Ix) = valeur(Gy+1) il y a insertion de ligne et je renvoie Ty+1 en Jx+1.
Voilà, peut-être plus explicite formulé ainsi.
Merci de ton aide
A bientôt
Ix est en feuille "5-9-12"
Jx est en feuille "5-9-12"
Gy est en feuille "5-17"
Ty est en feuille "5-17"
Si valeur(Ix) = valeur(Gy) je renvoie Ty en Jx ensuite je boucle
Si valeur(Ix) = valeur(Gy+1) il y a insertion de ligne et je renvoie Ty+1 en Jx+1.
Voilà, peut-être plus explicite formulé ainsi.
Merci de ton aide
A bientôt
Mais si, on va finir par se comprendre
Tu as deux indices. x et y. Mais une seule boucle. Il y a truc pas clair. A moins que tu parles d'une double-boucle.
Mais attention, ce n'est pas trivial d'insérer des lignes dans un tableau qu'on est en train de parcourir. Si tu veux sauter des lignes, les prendre en considération deux fois et/ou pointer sur des lignes qui n'existent pas/plus/pas encore, c'est comme ça qu'il faut faire.
Bon, attention. A bien étudier :
(Je n'ai pas de Windows ni d'Excel à la maison pour tester. Alors si il y a une coquille, tu devras la corriger de toi-même. Bah, de toute façon, comme ce code est à étudier, tu l'auras fait sans t'en rendre compte
)
Citation :
Si valeur(Ix) = valeur(Gy) je renvoie Ty en Jx ensuite je boucle Mais attention, ce n'est pas trivial d'insérer des lignes dans un tableau qu'on est en train de parcourir. Si tu veux sauter des lignes, les prendre en considération deux fois et/ou pointer sur des lignes qui n'existent pas/plus/pas encore, c'est comme ça qu'il faut faire.
Bon, attention. A bien étudier :
Dim cell_5912 As Range Dim cell_5_17 As Range Dim Premier As Boolean ' // Pour savoir s'il faut insérer ou pas Dim zone_5_17 As Range Set cell_5912 = Worksheets("5-9-12" ).Range("I2") Set zone_5_17 = Worksheets("5-17" ).Range(Worksheets("5-17").Range("G1" ), _ Worksheets("5-17").Range("G65536" ).End(xlUp)) Do While cell_5912.Text <> "" Premier = True For Each cell_5_17 In zone_5_17 If cell_5912.Value = cell_5_17.Value Then If Premier Then Premier = False Else Set cell_5912 = cell_5912.Offset(1) cell_5912.EntireRow.Insert Shift:=xlDown End If ' // Code n°1. En considérant les lignes complètes ' // I(10-ème) <-- T(20-ème colonne) cell_5912.EntireRow.Cells(10).Value = cell_5_17.EntireRow.Cells(20).Value ' // Code n°2. En se décalant par rapport aux cellules que nous avons déjà ' // J(=I+1) <-- T(=G+13) cell_5912.Offset(0, 1).Value = cell_5_17.Offset(0, 13).Value End If Next Set cell_5912 = cell_5912.Offset(1) Loop
(Je n'ai pas de Windows ni d'Excel à la maison pour tester. Alors si il y a une coquille, tu devras la corriger de toi-même. Bah, de toute façon, comme ce code est à étudier, tu l'auras fait sans t'en rendre compte
)
Resalut zeb, un grand coup de chapeau si tu fais çà sans avoir excel. Tu t'approches de la solution, mais c'est encore pas çà. Si je pouvais de joindre un fichier ou une image écran, je le ferais à la mano et tu comprendrais très vite, ce que je veux faire. Je vais regarder ton code et essayer d'adapter.
Encore un grand merci et dis mois si je peux mettre une image écran sur le forum.
A bientôt
Encore un grand merci et dis mois si je peux mettre une image écran sur le forum.
A bientôt
Il n'est pas souhaitable que des fichiers pleins de macros soient échangés ici. Ça attirerait irrémédiablement certaines maladies contagieuses.
Pour mettre une image, choisis-toi un site de partage et donne le lien ici entre les balises
/img]. Mais il est fort probable que le lien et l'image ne durent pas autant que ton topic. Aussi, t'invité-je plutôt à correctement décrire ton problème.
« Ce qui se conçoit bien s'énonce clairement.
Et les mots pour le dire lignes de code pour le programmer arrivent aisément. »
- Boileau+Zeb" alt="" class="imgLz frmImg" />
Pour mettre une image, choisis-toi un site de partage et donne le lien ici entre les balises
---------------
« Ce qui se conçoit bien s'énonce clairement.
Et les mots pour le dire lignes de code pour le programmer arrivent aisément. »
- Boileau+Zeb" alt="" class="imgLz frmImg" />
Bonsoir à toutes et à tous, j'ai essayé d'appliquer le code zeb, mais j'ai une erreur 1004. Voici le code l'erreur est en ligne 36
Sub recherchV()
Dim ws_srce_1 As Worksheet '// Source #1
Dim ws_srce_2 As Worksheet '// Source #2
Dim ws_target As Worksheet '// Cible
Dim cell_s1 As Range
Dim cell_s2 As Range
Dim cell_tg As Range
Dim zone_s1 As Range
Dim zone_s2 As Range
Set ws_srce_1 = Worksheets("5-9-12")
Set ws_srce_2 = Worksheets("5-17")
Set ws_target = Worksheets("5-9-12")
' // On positionne la cible sur la dernière ligne vide.
' // Le fait que la feuillec puisse être complètement vide est géré
' // La référence est la colonne 1 - à adapter.
Set cell_tg = ws_target.Range("I65536").End(xlUp)
If cell_tg.Text <> "" Then Set cell_tg = cell_tg.Offset(1)
' // Les valeurs à chercher sont dans la colonne I
Set zone_s1 = ws_srce_1.Range(ws_srce_1.Range("I1"), _
ws_srce_1.Range("I65536").End(xlUp))
' // Les valeurs à trouver sont dans la colonne G
Set zone_s2 = ws_srce_2.Range(ws_srce_2.Range("G1"), _
ws_srce_2.Range("G65536").End(xlUp))
For Each cell_s1 In zone_s1
For Each cell_s2 In zone_s2
If cell_s1.Value = cell_s2.Value Then
' // Trouvé ! On copie de la source 2 vers la cible
cell_s1.EntireRow.Copy Destination:=cell_tg ' ici j'ai une erreur d'exécution 1004
Set cell_tg = cell_tg.Offset(1)
End If
Next
Next
End Sub
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :