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
Salut, Creepy.

Je pense que tu as parfaitement analysé le problème:

Dans une boucle For i=1 to ValeurMax, on ne peux pas modifier la valeur de fin de la boucle en cours de boucle. Du moins, si cette valeur de fin de boucle est stockée dans une variable, tu peux modifier la variable, mais la boucle s'arrêtera à la valeur qui lui a été donnée au début.

Supprime le Fin=Fin+1, et remplace For boucle=2 to Fin Step 2 par:
For boucle=2 to 2*Fin Step 2
et ça devrait faire toute la boucle que tu souhaites.

Bonne journée.
Laurent.

PS: j'essaye d'insérer une image:
 
P

Pascal76

Guest
Salut Creepy,

Même si tu fais varier ta valeur de fin de boucle cela s'arrête à la valeur enregistrée au début

Essaies cettte manière de faire et dis mois si cela te convient

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

Pascal
 
P

Pascal76

Guest
Salut Creepy,

Même si tu fais varier ta valeur de fin de boucle cela s'arrête à la valeur enregistrée au début

Essaies cettte manière de faire et dis mois si cela te convient

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

Pascal
 
C

Creepy

Guest
Lapin titic, lapin tictic (kisscool pour ceux qui aurait pas reconnu !)

Re all

Bon non ca marche pas !!

G aussi essayé un fin+2

ca marche pas non plus

Une autre idée ? Doit bien y avoir un moyen de réactualiser le FOR quand même ??

Merci

Creepy
 
L

LaurentTBT

Guest
Non, Pascal, tu as la meilleure solution: partir de la fin!
Comme cela, on ne s'embête pas avec les lignes qui se rajoutent.

Sinon, Creepy, pour ta macro initiale, il fallait aussi enlever l'arrêt de boucle (exit sub):

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

Mais je répéte: la façon de faire de Pascal est à retenir.

Du coup, cette fois, ce n'est pas moi qui ferai sortir le lapin du chapeau!

@+
Laurent.
 
B

Billcodbar

Guest
J'ai une solution qui emprunte une voie distincte mais c'est le résultat qui compte
1. insère cette formule dans une cellule de la ligne 2 :
=si(estvide(A2);"";1)
2. recopie cette formule vers le bas
3. voici ta macro qui suppose que la formule indiquée se trouve dans la cellule AA2

Sub a()
'défini une variable
Dim Boucle As Long
'lui attribue une valeur
Boucle = 2
'entame une boucle
For Boucle = 2 To 65000 Step 2
'si la valeur est égale à "" alors fin de macro
If Range("aa" & Boucle).Value = "" Then
Exit Sub
End If
'sinon insère une ligne
Rows(Boucle & ":" & Boucle).Select
Selection.Insert Shift:=xlDown
'ferme la boucle
Next Boucle
End Sub
 
L

LaurentTBT

Guest
Rebonjour à tous.

Bon, Creepy n'a plus que l'embarras du choix.

Personnellement, je persiste avec la solution de Pascal, parce que l'idée de partir d'en bas est à retenir, elle nous avait déjà sauvés sur un ancien fil où il fallait cette fois supprimer des lignes.

En fait, si tu permets, Pascal, voici une façon de l'écrire sans passer par des sélections de cellules qui, si la macro doit agir sur un très grand nombre de lignes, prennent toujours beaucoup de temps:

Dim Boucle As Long
For Boucle = Range("a1").End(xlDown).Row To 2 Step -1
Rows(Boucle & ":" & Boucle).Insert Shift:=xlDown
Next Boucle

Et en plus, c'est plus court à écrire!

Bonne fin de journée à tous.
Laurent.
 
P

Pascal76

Guest
Salut Laurent

Pas de problèmes je suis surtout là pour apprendre et enlever de mauvaises habitudes prises avec le temps.

De plus cette idée de partir du bas je crois bien que je l'avais vu dans un autre fil comme tu dis et maintenant je l'utilise.

Bonne fin de journée

Pascal
 

Discussions similaires

Statistiques des forums

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