Salut Erwan Narcos et le forum
Bienvenue
Alors voilà, à la suite d'un cours en Informatique sur Excel, on nous a demandé de commencer à manipuler les macros, mais non pas seulement en les enregistrant, mais aussi en écrivant en VBA.
C'est comme ça que tout le monde commence : en enristrant des macros, puis en écrivant le code directement. Le fait de suivre un cours ne fait malheureusement pas tout. Certains enseignants devraient combleraient certaines de leurs lacunes ![:mrgreen:](https://www.developpez.net/forums/images/smilies/icon_mrgreen.gif)
Par principe, quand tu viens demander des améliorations, je te conseillerais de donner toute ta macro : pas la peine d'aider sur une partie, si le reste pose un problème. Excel a toujours une infinité de manières de résoudre un problème, et la macro en intégralité permet soit de continuer sur la même idée, soit de la remanier intégralement.
On va partir du principe que tu débute complêtement
1 2
| Cells(16384, 2).End(xlUp).Select
Selection.EntireRow.Insert |
Ouais, ouais, et ton prof ne t'a même pas corrigé ?
Cells(16384, 2).End(xlUp).
Litteralement : dernière cellule de la colonne B avant un changement d'état (vide ou non) en partant de la ligne 16384 et en remontant.
En règle générale, on part d'une cellule dont on est sûr de l'état, ainsi que la ligne précédente : la dernière cellule de la colonne : 65536, pour les versions précédente et Rows.count, pour la version 2007 et plus.
Pour faire court :
si les lignes 16384 et 16383 sont vides, on a la dernière ligne non vide de la colonne B
Si les lignes 16384 et 16383 ne sont pas vides, on a la dernière cellule vide avant la ligne 16383.
Tu utilises un Select/selection : ça ralentit ta macro, ce n'est que rarement utile et ça peut induire une erreur.
Ce que j'aurais mis :
Cells(Rows.Count, "B").End(xlUp).EntireRow.Insert
On ne peut pas dire que ce soit fondamentalement différent.
après, on doit choisir la ligne qu'on vient d'insérer : Il y a plusieurs solutions, qui tournent toutes autour de la dernière ligne : en reprenant ton exemple
Range("A4:A5").AutoFill Destination:=Range("A4:A7")
Deux remarques :
- On vient de créer une ligne en nous servant de la colonne B en référence et ça n'apparaît nulle part.
- On recopie avec incrémentation 2 lignes, à partir de la ligne 4
Mais comme on a qu'un extrait de macro, je ne vais m'occuper que de la destination : début : A4
Fin : avant dernière ligne en B : on peut l'écrire de différente manière, passer par des variables, etc... mais comme on a pas toute la macro, je propose :
Destination:=Range("A4:A" & Cells(Rows.count, "B").end(XlUp).row-1)
Ça marche dans pratiquement tous les cas, comme notation. On peut utiliser aussi d'autres notations :
Destination:=Range("A4:A" & Cells(Rows.count, "B").end(XlUp)(0).row)
Destination:=Range([A4], Cells(Rows.count, "B").end(XlUp).Offset(-1,0))
Destination:=Range([A4], Cells(Rows.count, "B").end(XlUp)(0))
Pour me répéter, les méthodes et les notations dépendent de celui qui fait le code. Certains préfèrent telle ou telle manière de rédiger le code, et toutes sont plus ou moins similaires. Elles dépendent surtout de leurs lisibilités pour le codeur.
A+
PS Comme c'est une simple explication, je n'ai pas testé. Et des oublis de parenthèses ne sont pas à exclurent.
Partager