Se connecter avec
S'enregistrer | Connectez-vous

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.

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

Salut Zeb et merci du conseil. Voici mon code
Bonne journée.

  1. Sub test()
  2. Set plage = Sheets("5-17").Range("G2:T" & Sheets("5-9-12").Range("I65536").End(xlUp).Row)
  3. For Each cel In Range("i2", Range("i65536").End(xlUp))
  4. cel.Offset(, 1) = Application.VLookup(cel, plage, 14, 0)
  5. Next
  6.  
  7. End Sub
Expert Programmation

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.

Citation :
Bonne journée.
Merki. Ma journée sera encore meilleure quand tu auras une soluce ;) 

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.
Expert Programmation

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 ?
:pt1cable: 

Etudie ce code :
  1. Dim ws_srce_1 As Worksheet '// Source #1
  2. Dim ws_srce_2 As Worksheet '// Source #2
  3. Dim ws_target As Worksheet '// Cible
  4.  
  5. Dim cell_s1 As Range
  6. Dim cell_s2 As Range
  7. Dim cell_tg As Range
  8.  
  9. Dim zone_s1 As Range
  10. Dim zone_s2 As Range
  11.  
  12. Set ws_srce_1 = Worksheets("5-9-12")
  13. Set ws_srce_2 = Worksheets("5-17")
  14. Set ws_target = Worksheets("5-5678-123")
  15.  
  16. ' // On positionne la cible sur la dernière ligne vide.
  17. ' // Le fait que la feuillec puisse être complètement vide est géré
  18. ' // La référence est la colonne 1 - à adapter.
  19. Set cell_tg = ws_target.Range("A65536").End(xlUp)
  20. If cell_tg.Text <> "" Then Set cell_tg = cell_tg.Offset(1)
  21.  
  22. ' // Les valeurs à chercher sont dans la colonne I
  23. Set zone_s1 = ws_srce_1.Range(ws_srce_1.Range("I1"), _
  24. ws_srce_1.Range("I65536").End(xlUp))
  25.  
  26. ' // Les valeurs à trouver sont dans la colonne G
  27. Set zone_s2 = ws_srce_2.Range(ws_srce_2.Range("G1"), _
  28. ws_srce_2.Range("G65536").End(xlUp))
  29.  
  30. For Each cell_s1 In zone_s1
  31. For Each cell_s2 In zone_s2
  32. If cell_s1.Value = cell_s2.Value Then
  33. ' // Trouvé ! On copie de la source 2 vers la cible
  34. cell_s2.EntireRow.Copy Destination:=cell_tg
  35. Set cell_tg = cell_tg.Offset(1)
  36. End If
  37. Next
  38. Next
Si tu n'as pas compris, réétudie-le.
Si tu as compris, tu auras soit la solution à ton problème ( :sol:  ) soit tu auras compris que je ne t'ai toujours pas compris. Et là : il faudra encore réexpliquer .... :D 
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
Expert Programmation

Mais si, on va finir par se comprendre ;) 

Citation :
Si valeur(Ix) = valeur(Gy) je renvoie Ty en Jx ensuite je boucle
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 :
  1. Dim cell_5912 As Range
  2. Dim cell_5_17 As Range
  3. Dim Premier As Boolean ' // Pour savoir s'il faut insérer ou pas
  4. Dim zone_5_17 As Range
  5.  
  6. Set cell_5912 = Worksheets("5-9-12" ).Range("I2")
  7. Set zone_5_17 = Worksheets("5-17" ).Range(Worksheets("5-17").Range("G1" ), _
  8. Worksheets("5-17").Range("G65536" ).End(xlUp))
  9.  
  10. Do While cell_5912.Text <> ""
  11. Premier = True
  12. For Each cell_5_17 In zone_5_17
  13. If cell_5912.Value = cell_5_17.Value Then
  14. If Premier Then
  15. Premier = False
  16. Else
  17. Set cell_5912 = cell_5912.Offset(1)
  18. cell_5912.EntireRow.Insert Shift:=xlDown
  19. End If
  20.  
  21. ' // Code n°1. En considérant les lignes complètes
  22. ' // I(10-ème) <-- T(20-ème colonne)
  23. cell_5912.EntireRow.Cells(10).Value = cell_5_17.EntireRow.Cells(20).Value
  24.  
  25. ' // Code n°2. En se décalant par rapport aux cellules que nous avons déjà
  26. ' // J(=I+1) <-- T(=G+13)
  27. cell_5912.Offset(0, 1).Value = cell_5_17.Offset(0, 13).Value
  28. End If
  29. Next
  30. Set cell_5912 = cell_5912.Offset(1)
  31. 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 :whistle:  )

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
Expert Programmation

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" />

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

  1. Sub recherchV()
  2.  
  3. Dim ws_srce_1 As Worksheet '// Source #1
  4. Dim ws_srce_2 As Worksheet '// Source #2
  5. Dim ws_target As Worksheet '// Cible
  6.  
  7. Dim cell_s1 As Range
  8. Dim cell_s2 As Range
  9. Dim cell_tg As Range
  10.  
  11. Dim zone_s1 As Range
  12. Dim zone_s2 As Range
  13.  
  14. Set ws_srce_1 = Worksheets("5-9-12")
  15. Set ws_srce_2 = Worksheets("5-17")
  16. Set ws_target = Worksheets("5-9-12")
  17.  
  18. ' // On positionne la cible sur la dernière ligne vide.
  19. ' // Le fait que la feuillec puisse être complètement vide est géré
  20. ' // La référence est la colonne 1 - à adapter.
  21. Set cell_tg = ws_target.Range("I65536").End(xlUp)
  22. If cell_tg.Text <> "" Then Set cell_tg = cell_tg.Offset(1)
  23.  
  24. ' // Les valeurs à chercher sont dans la colonne I
  25. Set zone_s1 = ws_srce_1.Range(ws_srce_1.Range("I1"), _
  26. ws_srce_1.Range("I65536").End(xlUp))
  27.  
  28. ' // Les valeurs à trouver sont dans la colonne G
  29. Set zone_s2 = ws_srce_2.Range(ws_srce_2.Range("G1"), _
  30. ws_srce_2.Range("G65536").End(xlUp))
  31.  
  32. For Each cell_s1 In zone_s1
  33. For Each cell_s2 In zone_s2
  34. If cell_s1.Value = cell_s2.Value Then
  35. ' // Trouvé ! On copie de la source 2 vers la cible
  36. cell_s1.EntireRow.Copy Destination:=cell_tg ' ici j'ai une erreur d'exécution 1004
  37. Set cell_tg = cell_tg.Offset(1)
  38. End If
  39. Next
  40. Next
  41.  
  42. End Sub
Expert Programmation

Hum....
Un peu de débogage s'impose.
Ajoute la ligne suivante juste avant la ligne 36 :
  1. MsgBox "Adresse source : " & cell_s1.Address & vbCrLf & _
  2. "Adresse target : " & cell_tg.Address


Qu'est-ce que ça donne ?
Lassé par la pub ? Créez un compte