Excel/VBA DoEvents и контроль возврата

Я пытаюсь сделать макрос, который возвращает хотя бы частичный контроль пользователю при запуске. Поведение макроса не может быть опасно изменено, если пользователь редактирует ячейки, так как имеется мало зависимого содержимого.

Я использую этот метод, чтобы позволить пользователю занять поток выполнения и зафиксировать изменения в своих ячейках, прежде чем макрос вернет себе контроль и перейдет к следующему оператору:

Sub retCtrl(Optional ms As Long = 350)
Dim l As Long: l = Timer
Do While Timer - l < (0# + ms / 1000)
    DoEvents
Loop
End Sub

Я поместил это после некоторых длинных заявлений и внутренних циклов.

Это нестабильно, но функционально, только с одной проблемой: если пользователю требуется много времени для редактирования ячейки, макрос молча останавливается.

Кто-нибудь может объяснить, почему это происходит? Это потому, что таймер истекает порог? Я думал, все выполнение макроса останавливается, когда книга находится в режиме редактирования?

Любой совет, как справиться с этим иначе?

1 ответ

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

Excel ожидает, что определенные элементы находятся в определенных состояниях, и когда пользователь начинает что-то менять, могут произойти непредвиденные события. Например, что произойдет, если пользователь попытается изменить данные в то же время, когда это нужно Excel? Нет встроенной мультипроцессорной обработки, "это не тот тип программирования..."

Поэтому Excel перестает запускать макрос, когда замечает, что что-то происходит. Если вам нужно запустить другой процесс одновременно, сделайте это в отдельном экземпляре Excel.


Дополнительная информация:

Другие вопросы по тегам