OVH Cloud OVH Cloud

Do... Loop ?

4 réponses
Avatar
Laure
Bonjour,

J'ai créé une macro qui s'exécute en boucle grâce à Do...Loop.
Je voulais faire un bouton pour l'arrêter, mais une fois qu'elle est
lancée... Ben ma fois, elle tourne en boucle, et rien à faire, je n'ai plus
la main,je suis obligée de forcer Excel à quitter par le gestionnaire des
tâches.

Comment faire pour l'arrêter ?

C'est ce type de truc que j'utilise (en fait je voulais pour m'amuser
refaire l'écran Matrix avec les colonnes de caractères qui descendent...)

Do
Range("B48").Select
Selection.Cut Destination:=Range("B1")
Range("B47").Select
Selection.Cut Destination:=Range("B48")
Range("B46").Select
'Etc... jusqu'à :
Range("B1").Select
Selection.Cut Destination:=Range("B2")
Loop
End Sub


D'autre part, y a-t-il moyen de ralentir l'exécution de la macro, de façon à
ce que visuellement les caractères "tombent" moins vite ?

Bon je sais que c'est juste pour m'amuser, et surtout pour apprendre, et que
ça sert à rien !! :-)

Merci d'avance !!


Laure

4 réponses

Avatar
michdenis
Bonjour Laure,

Utilise un nouveau classeur, dans la Feui1 , de A1:A5, inscris un mot

Copie tout ce qui suit dans un module standard de ton classeur :
exécute la procédur "LeFun"

Tu veux autre chose ? à adapter à ton application.

'Déclaration API : Tout en haut du module standard :
Public Declare Function GetTickCount Lib "kernel32" () As Long
'------------------------------
Sub SlowDown(Millisec As Long)
Dim old As Long
old = GetTickCount
While GetTickCount - old < Millisec
DoEvents
Wend
End Sub


'------------------------------
Sub LeFun()

With Worksheets("Feuil1")
Set Rg = .Range("A1:A5")
For Each cel In Rg
If cel <> "" Then
nb = cel.Characters.Count
For A = 1 To nb
C = .Range("A1").Characters(A, 1).Text
cel.Offset(, 1) = cel.Offset(, 1) & C
SlowDown 250 'un quart de seconde, à adapter
Next
End If
Next
End With

End Sub
'------------------------------


Salutations!





"Laure" a écrit dans le message de news: 435664f9$0$989$
Bonjour,

J'ai créé une macro qui s'exécute en boucle grâce à Do...Loop.
Je voulais faire un bouton pour l'arrêter, mais une fois qu'elle est
lancée... Ben ma fois, elle tourne en boucle, et rien à faire, je n'ai plus
la main,je suis obligée de forcer Excel à quitter par le gestionnaire des
tâches.

Comment faire pour l'arrêter ?

C'est ce type de truc que j'utilise (en fait je voulais pour m'amuser
refaire l'écran Matrix avec les colonnes de caractères qui descendent...)

Do
Range("B48").Select
Selection.Cut Destination:=Range("B1")
Range("B47").Select
Selection.Cut Destination:=Range("B48")
Range("B46").Select
'Etc... jusqu'à :
Range("B1").Select
Selection.Cut Destination:=Range("B2")
Loop
End Sub


D'autre part, y a-t-il moyen de ralentir l'exécution de la macro, de façon à
ce que visuellement les caractères "tombent" moins vite ?

Bon je sais que c'est juste pour m'amuser, et surtout pour apprendre, et que
ça sert à rien !! :-)

Merci d'avance !!


Laure
Avatar
Jacques93
Bonjour Laure,

Par exemple :

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim bStop As Boolean

Private Sub CommandButton1_Click()
bStop = False
Do
Range("B48").Select
Selection.Cut Destination:=Range("B1")
For i = 47 To 1 Step -1
Range("B" & i).Select
Selection.Cut Destination:=Range("B" & i + 1)
DoEvents
Sleep 100
If bStop Then Exit Do
Next i
Loop
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Intersect(Target, Range("B1:B48")) Is Nothing Then
bStop = True
End If

End Sub

Bonjour,

J'ai créé une macro qui s'exécute en boucle grâce à Do...Loop.
Je voulais faire un bouton pour l'arrêter, mais une fois qu'elle est
lancée... Ben ma fois, elle tourne en boucle, et rien à faire, je n'ai plus
la main,je suis obligée de forcer Excel à quitter par le gestionnaire des
tâches.

Comment faire pour l'arrêter ?

C'est ce type de truc que j'utilise (en fait je voulais pour m'amuser
refaire l'écran Matrix avec les colonnes de caractères qui descendent...)

Do
Range("B48").Select
Selection.Cut Destination:=Range("B1")
Range("B47").Select
Selection.Cut Destination:=Range("B48")
Range("B46").Select
'Etc... jusqu'à :
Range("B1").Select
Selection.Cut Destination:=Range("B2")
Loop
End Sub


D'autre part, y a-t-il moyen de ralentir l'exécution de la macro, de façon à
ce que visuellement les caractères "tombent" moins vite ?

Bon je sais que c'est juste pour m'amuser, et surtout pour apprendre, et que
ça sert à rien !! :-)

Merci d'avance !!


Laure





--
Cordialement,

Jacques.

Avatar
Clément Marcotte
Bonjour,

En principe, Ctrl-Break ou Ctrl-Pause permet d'arrêter une macro en cours
d'exécution, bien que des fois l'arrêt n'est pas instantané.

D'un autre côté, il y a moyen de mettre une condition, soit dans le do, soit
dans le loop, mais pas les deux en même temps.

Quelques exemples pas testés et en vrac.

Une "fausse boucle comptée". (Pour ce genre d'histoire, une boucle For est
probablement plus efficace.)
La boucle tourne tant que la condition est remplie.

Ne sera jamais exécutée si x = 11 au lieu de 0

x = 0
do while x <= 10
x = x+ 1
autres instructions ici
loop

Sera exécutée au moins une fois, même si x = 11, parce que le test est en
fin de boucle
x= 11
do
instructions
loop while x<= 11

Une boucle tant qu'une condition n'est pas remplie:

Va être exécutée 11 fois
x=0
do until x> 10
instructions
x = x+1
loop

Ne sera jamais exécutée, parce que 11 est déjà plus grand que 10

x
do until x>10
instructions
x = x + 1
loop

et puis tu peux même ajouter un exit do pour sortir de la boucle en cours de
route, si nécessaire.


x = 11


"Laure" a écrit dans le message de news:
435664f9$0$989$
Bonjour,

J'ai créé une macro qui s'exécute en boucle grâce à Do...Loop.
Je voulais faire un bouton pour l'arrêter, mais une fois qu'elle est
lancée... Ben ma fois, elle tourne en boucle, et rien à faire, je n'ai
plus la main,je suis obligée de forcer Excel à quitter par le gestionnaire
des tâches.

Comment faire pour l'arrêter ?

C'est ce type de truc que j'utilise (en fait je voulais pour m'amuser
refaire l'écran Matrix avec les colonnes de caractères qui descendent...)

Do
Range("B48").Select
Selection.Cut Destination:=Range("B1")
Range("B47").Select
Selection.Cut Destination:=Range("B48")
Range("B46").Select
'Etc... jusqu'à :
Range("B1").Select
Selection.Cut Destination:=Range("B2")
Loop
End Sub


D'autre part, y a-t-il moyen de ralentir l'exécution de la macro, de façon
à ce que visuellement les caractères "tombent" moins vite ?

Bon je sais que c'est juste pour m'amuser, et surtout pour apprendre, et
que ça sert à rien !! :-)

Merci d'avance !!


Laure



Avatar
Laure
Merci à vous trois pour toutes ces infos.
Je vais tester tout ça !!

Merci encore :-)

Laure