Supposons qu'un bouton intégré dans ma feuille de calcul lance une fonction VBA.
Private Sub CommandButton1_Click()
SomeVBASub
End Sub
Private Sub SomeVBASub
DoStuff
DoAnotherStuff
AndFinallyDothis
End Sub
J'aimerais pouvoir avoir une sorte de bouton "annuler" qui arrêterait l'exécution SomeVBASub
à un moment arbitraire, et je n'ai pas l'intention d'impliquer Ctrl+Break
ici, car j'aimerais le faire en silence.
Je suppose que cela devrait être un problème assez commun, des idées?
Merci.
Ajoutez un autre bouton appelé "CancelButton" qui définit un indicateur, puis recherchez cet indicateur.
Si vous avez de longues boucles dans la "substance", vérifiez-la également et quittez-la si elle est définie. Utilisez DoEvents dans de longues boucles pour vous assurer que l'interface utilisateur fonctionne.
Bool Cancel
Private Sub CancelButton_OnClick()
Cancel=True
End Sub
...
Private Sub SomeVBASub
Cancel=False
DoStuff
If Cancel Then Exit Sub
DoAnotherStuff
If Cancel Then Exit Sub
AndFinallyDothis
End Sub
Qu'en est-il de Application.EnableCancelKey - Utilisez le bouton Esc
On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler
MsgBox "This may take a long time: press ESC to cancel"
For x = 1 To 1000000 ' Do something 1,000,000 times (long!)
' do something here
Next x
handleCancel:
If Err = 18 Then
MsgBox "You cancelled"
End If
Extrait de http://msdn.Microsoft.com/en-us/library/aa214566(office.11).aspx
Ou, si vous voulez éviter l'utilisation d'une variable globale, vous pouvez utiliser la propriété rarement utilisée .Tag
du userform
Private Sub CommandButton1_Click()
Me.CommandButton1.Enabled = False 'Disabling button so user cannot Push it
'multiple times
Me.CommandButton1.caption = "Wait..." 'Jamie's suggestion
Me.Tag = "Cancel"
End Sub
Private Sub SomeVBASub
If LCase(UserForm1.Tag) = "cancel" Then
GoTo StopProcess
Else
'DoStuff
End If
Exit Sub
StopProcess:
'Here you can do some steps to be able to cancel process adequately
'i.e. setting collections to "Nothing" deleting some files...
End Sub
Je le fais beaucoup. Beaucoup. :-)
Je me suis habitué à utiliser "DoEvents" plus souvent, mais j'ai toujours tendance à mettre les choses en marche sans vraiment vérifier une méthode d'arrêt sûr.
Alors, aujourd’hui, après avoir refait le travail, j’ai pensé: «Eh bien, attendez la fin dans 3 heures» et j’ai commencé à pagayer dans le ruban. Un peu plus tôt, j'avais remarqué dans la section "Affichage" du Ruban un "Macros" déroulant, et je pensais avoir un coup d'oeil pour voir si je pouvais voir mon interminable Macro en cours d'exécution ....
Je réalise maintenant que vous pouvez également utiliser ceci avec Alt-F8.
Alors je me suis demandé si je me mettais dans une macro différente, est-ce que cela me sauverait? Cela fonctionne aussi: -) Cela fonctionne aussi si vous entrez dans votre macro en cours d’exécution (mais vous perdez toujours votre place), à moins que vous ne soyez un programmeur très paresseux comme moi et que vous déclariez beaucoup de variables "globales", dans lesquelles Si les données globales sont conservées :-)
K
~ Pour ceux qui utilisent une zone de saisie personnalisée
Private Sub CommandButton1_Click()
DoCmd.Close acForm, Me.Name
End
End Sub
ce que jamietre a dit, mais
Private Sub SomeVBASub
Cancel=False
DoStuff
If not Cancel Then DoAnotherStuff
If not Cancel Then AndFinallyDothis
End Sub