Прервать / прервать цикл VBA - PullRequest
4 голосов
/ 19 июля 2010

В VBA в Excel у меня есть цикл из нескольких тысяч ячеек, который занимает несколько минут.

Можно ли отменить долгосрочный цикл (если да, как) / можно ли создать кнопку или что-то в этом роде, чтобы прерывать этот цикл вручную?

Создание кнопки и ее наложениемакрос не проблема, только сам код.

Ответы [ 4 ]

12 голосов
/ 19 июля 2010

Когда Excel занят выполнением макроса, он не будет реагировать на кнопку.
У вас есть три варианта здесь:

  1. Использовать Ctrl+Break ключи (в отличие от кнопки)
  2. Сделайте ваш макрос намного быстрее (возможно, установив Application.ScreenUpdating в False поможет)
  3. Сделай свой макрос гораздо медленнее, вставив DoEvents во внутреннем цикле. это Кстати, Excel будет привязываться к кнопкам в тем временем. Макрос, который будет вызывать эта кнопка, просто установит глобальную переменную на True (очевидно, ваш внутренний цикл должен проверять эту переменную на каждой итерации и завершать работу, если она True).
4 голосов
/ 19 июля 2010

Application.EnableCancelKey может быть то, что вы ищете.
См. Пример кода по связанному URL-адресу при передаче управления обработчику ошибок, когда пользователь нажимает escape-символы.

2 голосов
/ 02 июля 2014

В дополнение к другим ответам,

Допустим, вы хотите взломать код и по-прежнему выполнять определенные действия в своем коде. Это можно сделать путем захвата прерывания и его обработки

Выможно использовать Err.Number для записи номера ошибки

В частности, Err.Number = 18 относится к пользовательским перерывам

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 голосов
/ 22 сентября 2017

Нет, кнопка не остановит работающий макрос. Это вещь разработчика, и контроль не должен быть в руках пользователя по умолчанию. Вы можете попробовать приведенную ниже комбинацию клавиш, чтобы остановить макрос.

  • Ctrl + Пауза / Перерыв
  • Ctrl + ScrLk
  • Esc + Esc (нажмите дважды последовательно)

Иногда правильный набор клавиш ( Пауза , Перерыв или ScrLk) недоступен на клавиатуре (в основном это происходит с пользователями ноутбуков) и нажатие Esc 2, 3 или несколько раз не останавливает макрос тоже.

Я тоже застрял и в конце концов нашел решение в функции доступности Windows, после чего я попробовал все исследуемые варианты, и более 3 из них работали для меня в 3 различных сценариях.

Шаг # 01 : Если на вашей клавиатуре нет определенной клавиши, не беспокойтесь и откройте «Клавиатуру на экране» из Windows Utilities, нажав Win + U .

Шаг # 02 : Теперь попробуйте любой из вышеперечисленных вариантов, и они определенно будут работать в зависимости от архитектуры вашей системы, то есть ОС и версии Office

Вы будете переведены в режим прерывания с использованием вышеуказанных комбинаций клавиш, поскольку макрос приостанавливает выполнение, немедленно завершая текущее задание. Например, если он извлекает данные из Интернета, он немедленно останавливается перед выполнением любой следующей команды, но после извлечения данных, после чего можно нажать F5 или F8 , чтобы продолжить отладку.

...