
Envoyé par
nubed
(.../...)Ici ce serait la limite, donc à partir de P2 (explicite) et End(x1Down).Row c’est jusqu’à temps qu’une cellule de la colonne soit vide ?
Exactement. En fait, pour savoir comment j'ai trouvé, il suffit de lancer l'enregistreur de macro, de mettre le curseur en P2, d'appuyer sur [Ctrl] et [flèche bas]. Tu arrêtes l'enregistrement, et le code te donne :
1 2
| Range("P2").Select
Selection.End(xlDown).Select |
Qui se simplifie en
Range("P2").End(xlDown).Select
Or tu n'as pas besoin de selectionner la case, juste d'avoir son numéro de ligne - ta limite basse : Donc on remplace l'action Select par la propriété Row. Que j'alimente dans une donnée "Derligne", qui contient le numéro de la dernière ligne à trouver. Mon compteur est la variable "Ligne" (qui tient le même rôle que i dans ton code ou celui de rdrupt).
rdrupt utilise une méthode assez sympa aussi, mais plus englobante : il va chercher la dernière ligne de ton classeur ou tu as quelquechose avec son
1 2
| Set R = Wb.ActiveSheet.UsedRange
For i = R.Rows.Count To 2 Step -1 |
qui est plus élégant que mon code(sauf que dans ton cas, il faut bien le faire de haut en bas, et donc For i = 2 To R.Rows.Count.
Il évite aussi de mettre cette limite dans une variable, et l'utilise directement. C'est une question de choix, de style.
Si tu as des lignes à blanc que tu dois traiter aussi, la solution de rdrupt est ce qu'il te faut. Si tu dois t'arrêter au premier blanc de la colonne P, alors c'est bien ma solution qu'il faut prendre.(le plus probable est que les deux conviennent).
(Conclusion 1) : le vrai problème était que ton i n'était pas déclaré, et commençant à 2, était inféré en integer. La limite d'integer, c'est 32 767. En le forçant en double, tu peux monter à 2 147 483 647 lignes. Ca laisse de la marge.
(Conclusion 2) : ça suffit pour faire marcher ton code, mais j'ai fait des tests en pas-à-pas sur ton "for i = 2 to i", ça se comporte à peu près bien. Mais il peut y avoir des effets de bord, euh, désagréables. Pour rester poli. Par exemple, si ta dernière ligne est la ligne 5, comme i a servi de compteur, après la boucle, i = 6. Et si tu as encore besoin, tu est chocolat, parcequ'il a changé de valeur.
(Conclusion 3) : un détail. Comme tu mets Application.ScreenUpdating = False au début de ton code(un excellent reflexe), il faut mettre Application.ScreenUpdating = True à la fin de ton code, pour être propre.
Partager