Salut,
Se servir de l'enregistreur et adapter le code obtenu est une excellente chose. Mais l'on est vite limité si l'on ne connaît pas ni le VB, ni les objets VBA spécifiques à Excel.
Je t'invite tout d'abord à lire cet article :
http://www.presence-pc.com/forum/ppc/Programmation/vous...
Revenons à ton code.
Tu sélectionnes telle cellule à seule fin de t'en servir pour définir telle autre. C'est peu productif. Par principe, dès que tu vois le code suivant :
Object.Select
Slection.Action
Transforme-le directement en :
Object.Action
Ça fait, pour les deux premières lignes de ton code :
Range(Range("A3" ), Range("A3" ).End(xlDown)).Select
Bon, là encore, il y a un
Select. Je parie que tu ne peux rien sélectionner, mais juste référencer la zone.
Voici un exemple pour copier une zone, tel que l'enregistreur le code :
Range("A1:B3").Select
Selection.Copy
Sheets("Feuil2").Activate
Range("C4").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Que c'est laid : D'une part on sélectionne des tas de cellules pour rien, il suffisait de les désigner sans les sélectionner, et d'autre part, on abuse du presse-papier qui est une zone de mémoire à disposition de l'utilisateur, certainement pas des programmes. Imagine que plusieurs programmes, pour leur besoin interne, passent par le presse-papier en même temps. Quelle pagaille en perspective !
Donc supprimons et les sélections et l'usage du presse-papier :
Range("A1:B3").Copy Sheets("Feuil2").Range("C4")
Et oui, c'est tout. Bon, quand on jongle avec plusieurs feuilles, il est de bon ton de les préciser à chaque fois, en ne considérant que les feuilles de calcul, de surcroît :
Worksheets("Feuil2").Range("A1:B3").Copy Worksheets("Feuil2").Range("C4")
Revenons maintenant à ton cas. Tu veux copier une zone de la feuille 1 (hypothèse) qui commence à une cellule donnée (A3), qui finit vers le bas dès qu'on trouve une ligne vide (
End(xlDown)) vers une cellule (X42 - hypothèse) de la feuille 2 (hypothèse).
C'est parti :
Worksheets("Feuil1").Range(Worksheets("Feuil1").Range("A3"), Worksheets("Feuil1").Range("A3").End(xlDown)).Copy Worksheets("Feuil2").Range("X12")
Bon, c'est un peu lourd comme écriture ! On va alléger ça en mettant des variables :
Dim ws_source As Worksheets
Dim ws_target As Worksheets
Dim cell_source_1er As Range
Dim cell_source_der As Range
Dim cell_target As Range777
Set ws_source = Worksheets("Feuil1")
Set ws_target = Worksheets("Feuil2")
Set cell_source_1er = ws_source.Range("A3")
Set cell_source_der = cell_source_1er.End(xlDown)
Set cell_target = ws_target.Range("X12")
ws_source.Range(cell_prems, cell_source_der).Copy cell_target
En étudiant ce code, tu conviendras que la préparation est un peu laborieuse, mais dans un programme un peu plus long, d'un part ce sera plus facile à relire, et d'autre part, il est fort probable que tu n'ais pas à refaire certains calculs.
Cela t'aide-t-il ?