[VBA-Excel] Copier-coller sélection à partir d'une recherche

Copier-coller sélection à partir d'une recherche [VBA-Excel] - VB/VBA/VBS - Programmation

Marsh Posté le 09-12-2014 à 11:30:42    

Salut les hfriens!
Archi débutant sur VBA j'ai un besoin urgent pour mon travail d'utiliser une macro pour récupérer des données dans une feuille excel et les recoller dans une autre.
L'idée c'est que j'ai une base en vrac dans laquelle il me faut retrouver des références et une fois retrouvé je dois copier des valeurs de colonnes correspondantes dans une autre feuille ou se trouve ma base ordonnée.
J'ai commencé à faire un code mais j'ai des erreurs ou alors j'ai pas le résultat attendu. Le probleme c'est que je connais pas les syntaxes donc malgré quelques recherches je galere pas mal.
Quelqu'un pourrait jeter un oeil à mon fichier excel? (fichier de test tres restreint, en vrai j'ai 3000 lignes de références et une cinquantaine de colonnes à récupérer...)
Merci beaucoup
 
Voici le code que j'ai tapé (à moitié copié collé sur des exemples...), en attendant vous avez un site pratique pour héberger l'excel afin de le partager avec vous?
 

Code :
  1. Option Explicit
  2. Sub Macro2()
  3. '
  4. ' Macro2 Macro
  5. '
  6. Dim Ref As String 'Valeur à rechercher
  7. Dim L As Long 'Numero de la ligne résultat dans la feuille Base
  8. Dim i As Long 'Numéro de la ligne de recherche dans la feuille Bilan
  9. i = 1
  10. Ref = Range("A", i).Value
  11. While Ref <> "" 'recherche tant que cellule non vide
  12.     Sheets("Base" ).Select 'on se met actif dans la feuille Base
  13.     Cells.Find(What:="Ref", After:=ActiveCell, LookIn:= _
  14.         xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
  15.         xlNext, MatchCase:=False, SearchFormat:=False).Activate 'on recherche la valeur de la cellule dans la feuille Base
  16.     MsgBox ActiveCell.Address 'message box de verification de la pertinence de la recherche - temporaire
  17.     L = ActiveCell.Row 'on enregistre le numero de la ligne résultat
  18.     Range("D" & L & ":F" & L).Select 'on selectionne les colonnes qui nous interesse dans la ligne résultat
  19.     Selection.Copy 'on copie
  20.     Sheets("Bilan" ).Select 'on passe dans la feuille Bilan
  21.     Range("D", i).Select 'on se positionne dans la ligne pour laquelle on a fait la recherche, à la premiere colonne de la selection à coller
  22.     ActiveSheet.Paste 'on colle les colonnes copiées précédemment
  23.     Ref = Range("A", i + 1).Value 'on incrémente d'une ligne notre recherche
  24. Wend
  25. End Sub


Message édité par darksnyper le 09-12-2014 à 14:10:37

---------------
http://www.facebook.com/NicolasIssalyPhotography
Reply

Marsh Posté le 09-12-2014 à 11:30:42   

Reply

Marsh Posté le 09-12-2014 à 12:13:02    

 
           Bonjour,
 
           merci de respecter les règles du forum en éditant le post afin de baliser le code via l'icône dédiée !
           Lecture facilitée et plus facile pour indiquer un n° de ligne si besoin …
 
           Le plus facile pour un débutant, à part de consulter l'aide VBA intégrée donc à portée de clic,
           est d'effectuer la recherche manuellement en ayant au préalable activé le Générateur de macros : code livré sur un plateau ‼
 
           Un bon code est sans Select, voir par exemple l'aide de la méthode Range.Copy et son exemple :
           une seule instruction est nécessaire …
 

Reply

Marsh Posté le 09-12-2014 à 14:14:56    

Merci Marc pour ta réponse.
Je suis habitué de hfr mais pas de cette partie du coup j'avoue ne pas avoir lu les regles spécifiques..  
En fait j'ai utilisé le générateur pour avoir le code de base de la recherche et de la copie.  
Mon probleme c'est que comme j'ai besoin d'une boucle pour les 3000 lignes, je m'emmele un peu les pinceaux pour coder les adresses des cellules avec des variables. je pense que mon blocage est par là.
Merci pour le range.copy, c'est effectivement plus direct comme code.
J'ai une erreur 1004 quand je lance la macro, vous voyez une grosse erreur dans ma boucle While?  
Merci
 

Code :
  1. Option Explicit
  2. Sub Macro2()
  3. '
  4. ' Macro2 Macro
  5. '
  6. Dim Ref As String 'Valeur à rechercher
  7. Dim l As Long 'Numero de la ligne résultat dans la feuille Base
  8. Dim i As Long 'Numéro de la ligne de recherche dans la feuille Bilan
  9. i = 1
  10. Ref = Range("A", i).Value
  11. While Ref <> "" 'recherche tant que cellule non vide
  12.     Sheets("Base" ).Activate 'on se met actif dans la feuille Base
  13.     Cells.Find(What:="Ref", After:=ActiveCell, LookIn:= _
  14.         xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
  15.         xlNext, MatchCase:=False, SearchFormat:=False).Activate 'on recherche la valeur de la cellule dans la feuille Base
  16.     MsgBox ActiveCell.Address 'message box de verification de la pertinence de la recherche - temporaire
  17.     l = ActiveCell.Row 'on enregistre le numero de la ligne résultat
  18.     Range("D" & l & ":F" & l).Copy = Worksheets("Bilan" ).Range("D", i)
  19.     Ref = Range("A", i + 1).Value 'on met la valeur de la ligne suivante dans la variable de recherche
  20. Wend
  21. End Sub


Message édité par darksnyper le 09-12-2014 à 14:18:02

---------------
http://www.facebook.com/NicolasIssalyPhotography
Reply

Marsh Posté le 09-12-2014 à 14:49:13    

 
           Quelle est le n° de la ligne déclenchant l'erreur ?
 
           Sinon mauvaise utilisation de la méthode Find car quand il n'y pas de correspondance, erreur à coup sûr !
           C'est pourtant simple : la coder comme dans l'exemple de l'aide VBA intégrée.
 
           Si la recherche doit s'effectuer sur une colonne, il faut la préciser car là c'est sur l'intégralité de la feuille de calculs !
 
           J'espère aussi qu'il n'y a pas de formule de calculs dans la plage recherchée car là aussi,
           mauvais paramétrage : revoir alors l'aide de cette méthode Find
           Si mauvais paramétrage, mauvaise utilisation alors de la fonction de recherche depuis la feuille de calculs
           avec le Générateur de macros ! Donc pour obtenir un code fiable, recommencer en complétant bien l'assistant de la recherche …
 
           Tenter de comprendre en traduisant un code non abouti est une perte de temps !
           Le demandeur doit présenter une problématique claire & exhaustive, bref avec des tenants & aboutissants limpides,
           sinon les intervenants éventuels ne peuvent que théoriser à l'infini …
  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed