2010-07-19 7 views
4

En VBA sur Excel, j'ai une boucle sur plusieurs milliers de cellules, ce qui prend quelques minutes.Interruption/Annulation d'une boucle VBA

Est-il possible d'abandonner une boucle à long terme (si oui, comment)/puis-je créer un bouton ou quelque chose comme ça pour interrompre cette boucle manuellement?

Construire un bouton et le superposer avec une macro n'est pas un problème, seulement le code lui-même.

+0

Duplication possible: http://stackoverflow.com/questions/3018286/my-macro-is-stuck-how-do-i-kill-it – marg

+0

Faut-il faire une boucle dans chaque cellule manuellement? Vous pourriez peut-être retravailler le processus pour le rendre plus rapide, c'est-à-dire en utilisant la fonction FillDown d'Excel. Quand j'entends "boucle sur plusieurs milliers de cellules", je vois une opportunité d'optimiser. – PowerUser

+0

@PowerUser: Sry, ce n'est pas possible dans ce contexte, parce que je dois vérifier les cellules manuellement ;-) – poeschlorn

Répondre

12

Lorsque Excel est occupé à exécuter votre macro, il ne répond pas à un bouton.
Vous avez trois options:

  1. Utilisez Ctrl+Break touches (par opposition à un bouton)
  2. Faites votre macro beaucoup plus rapide (réglage peut-être Application.ScreenUpdating à False aidera)
  3. Faites votre macro beaucoup plus lent en insérant un DoEvents dans la boucle interne. De cette façon, Excel résonnera aux boutons dans pendant ce temps. La macro que ce bouton déclencherait définirait simplement une variable globale à True (évidemment, votre boucle interne devrait vérifier cette variable à chaque itération et quitter si elle est True).
3

Application.EnableCancelKey pourrait être la chose que vous recherchez.
Voir l'exemple de code sur l'URL liée, lors du passage du contrôle au gestionnaire d'erreurs lorsque l'utilisateur appuie sur l'échappement.

2

En plus d'autres réponses,

Disons que vous voulez briser le code et encore effectuer certaines actions dans votre code, vous pouvez le faire en capturant l'interruption et la manipulation

Vous pouvez utiliser Err.Number pour capturer le numéro d'erreur

Plus précisément, Err.Number = 18 fait référence à des ruptures utilisateur

Sub handleError() 
On Error GoTo MyErrorHandler 
Application.EnableCancelKey = xlErrorHandler 

'Just an example to show something is running 
For i = 0 To 900000 
Range("A1") = i 
Next i 

MyErrorHandler: 
If Err.Number = 18 Then '18 =User interrupt 
    MsgBox " You clicked Ctrl + Break " 
    Exit Sub 

End If 
End Sub 
0

Non, un bouton n'arrêtera pas la macro en cours d'exécution. C'est une chose de développeur et le contrôle ne devrait pas être entre les mains de l'utilisateur par défaut. Vous pouvez essayer la combinaison de touches ci-dessous pour arrêter la macro.

  • Ctrl + Pause/Attn
  • Ctrl + défil
  • Esc + Esc (Appuyez deux fois de suite)

Parfois, le droit se t de touches (Pause, Pause ou défil) ne sont pas disponibles sur le clavier (la plupart du temps se passe avec les utilisateurs d'ordinateurs portables) et en appuyant sur Echap 2, 3 ou plusieurs fois ne s'arrête pas la macro aussi. Je me suis coincé aussi et finalement trouvé la solution dans la fonctionnalité d'accessibilité de Windows après quoi j'ai essayé toutes les options recherchées et plus de 3 d'entre eux ont travaillé pour moi dans 3 scénarios différents.

Étape # 01: Si votre clavier ne dispose pas d'une clé spécifique, s'il vous plaît ne vous inquiétez pas et ouvrez le « clavier à l'écran » à partir de Windows Utilitaires en appuyant sur Win +U.

Étape # 02: Maintenant, essayez l'une de l'option ci-dessus et d'entre eux fonctionnera certainement en fonction de l'architecture de votre système c.-à-OS et version d'Office

Vous serez mis en mode pause à l'aide des combinaisons de touches ci-dessus car la macro suspend l'exécution en terminant immédiatement la tâche en cours. Par exemple, si elle tire les données du web, elle s'arrêtera immédiatement avant d'exécuter la prochaine commande mais après avoir tiré les données, après quoi vous pouvez appuyer sur F5 ou F8 pour continuer le débogage.