Bonsoir,
Désolé, j’avais lu trop vite au début, je n’avais pas enregistré qu’il y avait 2 feuilles distinctes. C”est pour cela que le "Range("A65535").End(xlUp)" me choquait.
Toutefois le problème est indépendant :
Range("A65535").End(xlUp)
renvoie un objet Range. Il est inutile d’utiliser .Row : au lieu de
Range("A3:C" & Range("A65535").End(xlUp).Row)
on peut utiliser directement
Range(Range("A3"), Range("C65535").End(xlUp))
si la colonne C est renseignée pour la dernière ligne ou
Range(Range("A3"), Range("A65535").End(xlUp).offset(0, 2))
si on n’est pas sûr que C est renseignée pour la dernière ligne. Il ne faut pas essayer de copier trop directement ce qui se passe dans l’environnement Excel ; dans Excel, une plage s’écrit A3:C341 par exemple. Dans VBA, bien souvent, les numéros de lignes ne sont pas connus et chercher à les déterminer n’est pas forcément utile. Le plus souvent, on connaît la plage (ou la cellule) de début et la plage (ou la cellule) de fin, qui bien souvent correspondent à des variables.
La syntaxe la plus courante pour désigner une plage est alors Range(Range1, Range2). C’est en général le + efficace.
Dans l’exemple de code, ce qui ne fonctionne pas, c’est
Range("A" & debut).Select
car début, défini ici :
debut = Range("calcul").End(xlUp).Offset(1)
est un objet Range et pas un numéro de ligne. Si tu as déclaré tes variables, ce que je te recommande très vivement (pour cela, sélectionne "Déclaration explicite des variables" dans les préférences), la syntaxe correcte est alors :
Set debut = Range("calcul").End(xlUp).Offset(1)
Ce que tu essayes d’obtenir avec
Range("A" & debut).Select
est très vraisemblablement ce que debut représente directement. Si calcul est défini en colonne A,
Range("A" & debut.Row).Select
est strictement équivalent à debut.
Par ailleurs, évite les Select autant ; le code que possible sera + concis, +lisible et s'exécutera + rapidement !
Sheets("Tables").Range("A3", Range("A65536").End(xlUp).Offset(0, 2)).Copy Sheets("Janvier").Range("A3").End(xlDown).Offset(1)
remplace ainsi avantageusement
1 2 3 4 5 6 7 8
| Sheets("tables").Select
Range("A3:C" & Range("A65535").End(xlUp).Row).Select
Selection.Copy
Sheets("Janvier").Select
debut = Range("calcul").End(xlUp).Offset(1)
Range("A" & debut).Select
ActiveSheet.Paste
Application.CutCopyMode = False |
NB - Si toutes les lignes de la colonne A sont remplies à partir de A3, passer par "Calcul" n’est pas nécessaire.
Par ailleurs,
1 2 3
| For j = debut To fin
Cells(j, 4).Value = i
Next j |
ne fonctionnera pas, car tels que définis dans la seconde verion de ton code, Debut et fin sont des cellules, et plus des numéros de ligne.
Enfin, j’ai du mal à comprendre la boucle qui va reporter les mêmes éléments 31 fois de suite sur la feuille janvier. La sélection reportée contient toutes les données de janvier si on utilise "Range("A3").End(xlDown)".
S'il est nécessaire de sélectionner les données d’un jour différent à chaque passage dans la boucle, il manque l’étape effectuant la sélection des données quotidiennes !
Partager