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.