Макрос во время работы не дает Excel отвечать (Microsoft 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 " & Y DoEvents
Другой вариант — просто не обновлять строку состояния так часто.
Если верхний конец вашего цикла очень велик, тогда, возможно, будет лучше рассчитать процент и обновить строку состояния, когда какая-то часть общего результата будет завершена — возможно, каждые 5% или 10% от общего количества. Это означало бы, что строку состояния нужно обновлять только 10 или 20 раз во время цикла, а не сотни или тысячи раз. Это может означать, что Windows может справляться с запросами на обновление строки состояния, и, в качестве бонуса, ваш макрос может работать быстрее, потому что ему не нужно так часто обновлять строку состояния.
_Примечание: _
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (13341) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365.