Expliquez moi pourquoi ma macro s'arrete ?

C

Creepy

Guest
Bonjour à tous,

Je voudrais inserer une ligne blanche entre chaque ligne d'un tableau pour faire des séparation.

Comme j'ai 2000 lignes j'ai voulu automatiser la tâche

J'ai fait une macro que j'ai testé sur un tableau bidon de 10 lignes

Voila la macro :

Dim Fin As Long
Dim Boucle As Long
Fin = Range("a1").End(xlDown).Row
Boucle = 2
Range("a2").Select
For Boucle = 2 To Fin Step 2
If Boucle = Fin Then
Exit Sub
End If
Rows(Boucle & ":" & Boucle).Select
Selection.Insert Shift:=xlDown
Fin = Fin + 1
Next Boucle

Le hic : Quand ma variable boucle=10, la macro s'arrête, alors que "boucle" n'est pas egal à "fin". En effet j'incremente "fin" de 1 à chaque passage pour arriver à la fin de mon tableau.

Je sais que la macro n'est pas bien ecrite, pourtant je vois ce qui cloche mais je ne comprends pas pourquoi ! ? ! On dirait que "boucle" est comparée à ma variable "fin", mais du début, non réactualisée.

Quelqu'un peut m'éclairer ?

Merci

Creepy
 

Pièces jointes

  • classeur1.zip
    7.3 KB · Affichages: 24
  • classeur1.zip
    7.3 KB · Affichages: 26
  • classeur1.zip
    7.3 KB · Affichages: 21
L

LaurentTBT

Guest
Si, Bernard, on peut encore faire plus court:

Range("A1") peut s'écrire [A1] (mais c'est une habitude que je n'ai pas personnellement, je préfère garder le Range, je trouve cela plus lisible. Ceci dit, c'est bien sûr juste une question de pratique)

Plus intéressant:
Rows(Boucle & ":" & Boucle) peut devenir plus simplement Rows(Boucle)
En fait, on prend l'item dont le n° est boucle dans la collections des Rows de la feuille.
Du coup, petit piège, cela ne fonctionne pas exactement pour des colonnes:
Si tu veux la colonne (D:D), il faut mettre soit
Columns(D:D), soit columns(4)

Enfin, l'argument Shift:=xlDown de Insert n'est pas obligatoire d'après le test que je viens de faire.

Conclusion:

Dim Boucle As Long
For Boucle = [a1].End(xlDown).Row To 2 Step -1
Rows(Boucle).Insert
Next Boucle

Mais bon, c'est vraiment pour pinailler!

Si seulement je pouvais moi aussi avoir une telle cure d'amaigrissement (lol)
Allez, j'essaie une formule magique, je vais peut-être perdre 5 kg d'un coup, qui sait?



Oups, j'y suis allé un peu fort là! c'est pas la bonne formule (lol)

Allez, à bientôt.
Laurent.
 
L

LaurentTBT

Guest
Dis moi, Bernard, je ne comprends pas.

Quel est le oups dans les itérations de la macro?
Chez moi, elle fonctionne, et je me retrouve bien avec une ligne vierge sur 2.
Je dois sans doute passer à côté de quelque chose,là.

@+.
Laurent.
 
L

LaurentTBT

Guest
Oui, c'est vrai, tu as raison, mais tout dépend de ce que l'on veut faire:

En fait, si une ligne est vierge, il insére en insére quand même une, et avec l'exemple initial de Creepy, je n'avais pas envisagé le cas où certaines cases sont vides.

Deux possibilités, selon ce que tu souhaites:
Insértion d'une ligne dés qu'il rencontre une cellule remplie, mais pas si une cellule est vide.
Ainsi, si tu fais 3 fois de suite la macro, tu auras d'abord 1, puis 2 et enfin 3 lignes entre chaque données

Dim Boucle As Long
For Boucle = [a65536].End(xlUp).Row To 2 Step -1
If Cells(Boucle, 1) <> "" Then Rows(Boucle).Insert
Next Boucle


Autre cas: l'insértion ne se fait que si la ligne est remplie, et qu'il n'y a pas déjà de ligne vierge au-dessus. Utile si la macro avait été lancée, et qu'on a rempli ensuite certaines lignes vierges, mais pas toutes.
Cette version est aussi utile si dès le départ, il existait des cases vides!

Dim Boucle As Long
For Boucle = [a65536].End(xlUp).Row To 2 Step -1
If Cells(Boucle, 1) <> "" And Cells(Boucle - 1, 1) <> "" Then Rows(Boucle).Insert
Next Boucle

Merci de me l'avoir fait remarqué.

Bonne soirée.
Laurent.

PS: le [a65536].End(xlUp) au lieu du [a1].End(xlDown) est très important, car avec la version en xldown, une ligne vide au milieu empêche d'aller jusqu'en bas du tableau!
 

Discussions similaires

Statistiques des forums

Discussions
312 971
Messages
2 094 045
Membres
105 926
dernier inscrit
Odyssea