Макрос во время работы не дает Excel отвечать

Когда Дэйв пишет макрос, который должен обрабатывать большой объем информации в цикле For … Next, он всегда использует строку состояния для индикации прогресса. Обычно там отображается сообщение, например «Обработка строки X из Y». Когда «Y» является большим значением (верхний конец цикла For … Next), Excel часто перестает обновлять строку состояния и отображает что-то вроде «Не отвечает» в строке заголовка Excel. Однако макрос все еще работает, и когда он завершается, Excel начинает отвечать, и все работает так, как должно. Дэйв задается вопросом, как он может заставить Excel перестать вести себя таким образом и вместо этого отображать обновления строки состояния, как он хочет.

Такое поведение, кажется, происходит, когда Windows кажется, что Excel перестает отвечать. (В конце концов, именно Windows отвечает за то, что отображается в строке заголовка программы.) Я мог довольно легко воспроизвести поведение, если у меня было несколько программ, открытых в Windows, и я щелкал в окне другой программы, пока Excel просматривает фрагменты. длинный макрос. По сути, если Excel занят выполнением макроса или не успевает просить Windows обновить строку состояния, тогда это действительно выглядит так, как будто Excel перестал отвечать.

Есть два возможных подхода, которые позволяют может быть использован. Во-первых, вы можете использовать команду DoEvents внутри цикла. Обычно это используется для указания макросу обращать внимание на все, что находится в очереди событий, например, когда кто-то нажимает на клавиатуру. Это эквивалентно принуждению Excel «искать» макрос, с которым он работает, и связываться с Windows. Это обязательно даст Windows знать, что Excel действительно реагирует, и позволит обновлять строку состояния. Вы даже можете ввести команду сразу после обновления строки состояния:

Application.StatusBar = «Processing row» & X & «of» & YDoEvents

Другое дело попробовать – это просто не обновлять строку состояния так часто. Если верхний конец вашего цикла очень велик, то может быть лучше рассчитать процент и обновить строку состояния, когда какая-то часть общего результата будет завершена – возможно, каждые 5% или 10% от общего количества. Это означало бы, что строку состояния нужно обновлять только 10 или 20 раз во время цикла, а не сотни или тысячи раз. Это может означать, что Windows может справляться с запросами на обновление строки состояния, и, в качестве бонуса, ваш макрос может работать быстрее, поскольку ему не нужно так часто обновлять строку состояния.

Источник: frestage.ru

Бытовой вопрос