web-dev-qa-db-fra.com

Comment arrêter le code VBA en cours d'exécution?

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.

14
be here now

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
20
Jamie Treworgy

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

9
Faheem

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
2
simpLE MAn

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

0
Kenson Gurney

~ Pour ceux qui utilisent une zone de saisie personnalisée

Private Sub CommandButton1_Click()

DoCmd.Close acForm, Me.Name
End

End Sub
0
Paul Clint

ce que jamietre a dit, mais

Private Sub SomeVBASub
    Cancel=False
    DoStuff
    If not Cancel Then DoAnotherStuff
    If not Cancel Then AndFinallyDothis
End Sub
0
Beth