Vba excel отключить обновление экрана

Обновлено: 08.07.2024

мой инструмент Excel выполняет длинную задачу, и я пытаюсь быть добрым к пользователю, предоставляя отчет о ходе работы в строке состояния или в некоторой ячейке на листе, как показано ниже. Но экран не обновляется или перестает обновляться в какой-то момент (например, 33%). Задача в конечном итоге завершается, но индикатор выполнения бесполезен.

что я могу сделать, чтобы принудительно обновить экран?

Я использую Excel 2003.

добавить функция doevents функция внутри цикла, см. ниже.

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

текстовые поля в листах иногда не обновляются когда изменяется их текст или форматирование, и даже команда DoEvent не помогает.

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

следующие команды, кажется, сделать трюк:

вызовите DoEvents в петле.

это повлияет на производительность, поэтому вы можете вызвать его только на каждой, скажем, 10-й итерации.
Однако, если у вас есть только 30, это не проблема.

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

и положить этому конец

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

в частности, если вы имеете дело с пользовательская форма, то вы можете попробовать перекрашивать метод. Вы можете столкнуться с проблемой с функция doevents Если вы используете триггеры событий в вашей форме. Например, любые клавиши, нажатые во время работы функции, будут отправлены функция doevents ввод с клавиатуры будет обработан до обновления экрана, поэтому, если вы меняете ячейки в электронной таблице, удерживая одну из клавиш со стрелками на клавиатура, затем событие изменения ячейки будет продолжать работать до завершения основной функции.

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

в коде UserForm это так же просто, как:

написать DoEvents непосредственно перед строкой, в которой вы обновляете пользовательский интерфейс, он должен работать.

Как ускорить и оптимизировать код VBA

Как такой код выглядит на практике. Предположим, надо записать в цикле в 10 000 строк значения:

Для более опытных пользователей VBA я приведу несколько решений по оптимизации кодов в различных ситуациях:

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

Позволяет включать (присвоением свойству True) и отключать (присвоением False) обновление экрана. Имеет смысл отключить обновление экрана перед теми частями программы, которые интенсивно пользуются данными на листе. Благодаря тому, что системные ресурсы не будут тратиться на обновление экрана, программа будет работать быстрее. Этот метод весьма актуален, так как MS Excel часто используют для проведения ресурсоемких расчетов.

Практика показывает, что если программа интенсивно использует вывод на экран в процессе работы, если она изменяет данные, которые участвуют в расчете формул, расположенных на листе, то отключение вывода может ускорить работу в 3-10 раз.

Например, ниже приведен код, который два раза повторяет процедуру 100-кратного вывода на экран 400 целых случайных чисел и выводит время, требующееся для выполнения этих действий с обновлением экрана и без него.

For y = 1 To 100

ActiveSheet.Cells(p, j) = _

Возвращает объект WorksheetFunction, методы которого представляют собой формулы Excel, которые можно использовать в коде VBA. Использование этого свойства позволяет облегчить выполнение сложных расчетов.

События Application

Объект Excel.Application поддерживает множество событий. Работа с ними аналогична работе с событиями Word.Application, которыми мы занимались в соответствующем разделе предыдущей главы.

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

Создайте новый модуль класса. Добавьте в него объявление объекта типа Excel.Application с событиями

Public WithEvents obj_ExApp As Excel.Application

Итак, вот код процедуры, который связывает объект созданного нами класса AppEvents с приложением:

Dim obj_ExcelAppEv As New AppEvents

Set obj_ExcelAppEv.obj_ExApp = Excel.Application

А вот полный код модуля класса AppEvents с объявлением объектной переменной и обработчиком события.

Public WithEvents obj_ExApp As Excel.Application

Private Sub obj_ExApp_NewWorkbook(ByVal Wb As Workbook)

How to dou

Простые хитрости 1 Формат числа

Table of Contents:


VBA для Excel 2016 работает быстро, но это не всегда достаточно быстро. (Компьютерные программы никогда не бывают достаточно быстрыми.) Продолжайте читать, чтобы открыть некоторые примеры программирования, которые вы можете использовать для ускорения макросов.

Отключение обновления экрана

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

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

Чтобы продемонстрировать разницу в скорости, выполните этот простой макрос, который заполняет диапазон цифрами:

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

Диапазон заполняется намного быстрее, и вы не видите результат до тех пор, пока макрос не будет завершен, и обновление экрана (автоматически) будет установлено на True.

Когда вы отлаживаете код, выполнение программы иногда заканчивается где-то посередине, если вы не включили обновление экрана. Это иногда приводит к тому, что окно приложения Excel становится полностью невосприимчивым. Выход из этого замороженного состояния прост: вернитесь к VBE и выполните следующее заявление в окне Immediate:

Отключение автоматического вычисления

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

Следующий оператор устанавливает режим вычисления Excel в руководство:

Выполните следующий оператор, чтобы настроить режим расчета на автоматический:

Если ваш код использует ячейки с результатами формулы, выключение вычисления означает, что ячейки не будут пересчитаны, если вы явно не указали Excel на это!


Вы можете указать Excel не отображать эти типы предупреждений при запуске макроса.

Когда процедура завершится, Excel автоматически сбрасывает свойство DisplayAlerts в значение True. Если вам нужно снова включить предупреждения, прежде чем процедура закончится, используйте это заявление:

Упрощение ссылок на объекты

Как вы, наверное, уже знаете, ссылки на объекты могут стать очень длинными. Например, полная ссылка на объект Range может выглядеть следующим образом:

Если ваш макрос часто использует этот диапазон, вам может понадобиться создать объектную переменную с помощью команды Set. Например, следующий оператор присваивает этому объекту Range объектной переменной Rate:

После определения этой объектной переменной вы можете использовать переменную Rate, а не длинную ссылку. Например, вы можете изменить значение ячейки с именем InterestRate:

Это гораздо проще ввести, чем следующее выражение:

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

Объявление типов переменных

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

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

В общем, вы должны использовать тип данных, который требует наименьшее количество байтов, но все же может обрабатывать все данные, назначенные ему. Когда VBA работает с данными, скорость выполнения зависит от количества байтов, которыми располагает VBA. Другими словами, чем меньше используется байт данных, тем быстрее VBA может получить доступ и манипулировать данными.Исключением является тип данных Integer. Если скорость критическая, используйте вместо этого длинный тип данных.

Если вы используете объектную переменную, вы можете объявить эту переменную как конкретный тип объекта. Вот пример:

Использование With-End со структурой

Вам нужно установить ряд свойств для объекта? Ваш код работает быстрее, если вы используете структуру With-End With. Дополнительным преимуществом является то, что ваш код может быть легче читать.

Следующий код не использует With-End With:

Вот тот же код, переписанный для использования With-End With:

Когда вы используете With-End With, убедитесь, что каждое утверждение начинается с точки.

Удаление (скрытие) строк по условию

макрос удалит на листе все строки, в которых содержится искомый текст:

Чтобы вместо удаления просто скрыть такие строки, замените строку


Ещё один вариант кода, позволяющего выполнять поиск (с последующим удалением или скрытием строк) сразу по нескольким условиям:

Комментарии

Я не занимаюсь поддержкой бесплатных макросов, и модификацией их под ваши требования.

Добавление комментариев к данной статье на этом отключаю.

Подскажите пожалуйста. Мучаюсь уже неделю. Не могу переделать существующие макросы для скрытия строк. Имеется таблица с цифрами. Нужно что бы скрывались строки если одновременно в столбце А и В и С и D значение меньше чем 0. Было бы не плохо это значение вводить в user form и там были кнопочки скрыть и показать все. Помогите пожалуйста. Да и ещё количество строк может бить разное. А цифровые значения начинаются с второй строки.

Здравствуйте, у меня такая ситуация. Есть таблица, с 3000 строками, и примерно 25 столбиками
Первые 10 столбиков заполнены текстом, с 11 по 25 столбик бывают цифры. Как мне удалить полностью строку, если в столбики с 11 по 25 все пустые ячейки ? а если хоть одна ячейка заполнена, то строку не трогать? но на первые десять столбиков не надо обращать внимание

А как сделать такое же условие для объеденных ячеек только по нескольким значениям?

Здравствуйте. Подскажите, пожалуйста, как прописать макрос так, чтоб он:
1. удалял все строки с заливкой цветом, или
2. удалял все строки, содержащие какую либо ячейку с заливкой цветом.
Спасибо.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim d As Integer
d = UsedRange.Rows.Count + 1
For rwIndex = 1 To 31
colIndex = 3
If Cells(rwIndex, colIndex).Value = 0 Then
Rows(rwIndex).Hidden = True
End If
Next
End Sub

Буду очень признательна)

Sub Show()
Columns.Hidden = False
Rows.Hidden = False

Сандер, так попробуйте:

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

Здравствуй Админ! Долго Вас искала. подрабатываю на СП закупках, и уже замучилась с заполнением каталогов, сил больше нет. Как-то покупала граббер у одного программиста, ну вообще не довольна , на одну закупку граббер стоит 2800, и работает через раз. Скажите как работает Ваша программа и сколько стоит, и можно ее настроить под сайт на котором я работаю и пользоваться ею постоянно один раз заплатив?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim ra As Range, finra As Range

If Not finra Is Nothing Then finra.EntireRow.Select
Application.ScreenUpdating = True
End If
End Sub

Андрей, так попробуйте

Со скрытием строчек все отлично. но что делать, если в дальнейшем мне нужно некоторые скрытые строки вновь раскрыть (т.к. признак для скрытия для них может в будущем быть нерелевантен)?
Сделал такую билеберду, но скрытые строки он не раскрывает 🙁 Видимо не видит скрытые строки. Помогите советом пожалуйста!

Sub Макрос()
Dim ra As Range, delra As Range, ТекстДляПоиска As String
Application.ScreenUpdating = False

If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then

If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
End If
Next

If Not delra Is Nothing Then delra.EntireRow.Hidden = False
End Sub

Спасибо, заработало.
Ну я и тупой.

Пожалуйста, подскажите что не так, в таком исполнении не хочет удалять с 17 строки.
Gjlcrf;bnt xnj yt nfr

If ra.row >= 17 then
For Each word In УдалятьСтрокиСТекстом
.
Next word
end if

Похоже я не совсем правильно выразил свою мысль, в макросе УдалениеСтрокПоНесколькимУсловиям нужно удалять строки с определенным текстом только с 17 строки и до конца листа.

нет, мне в этом макросе нужно что бы текст удалялся с определенной сторки.

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

Отключение обновления экрана - примеры кода VBA

Как бы здорово это ни выглядело, наблюдая, как ваш макрос VBA манипулирует экраном, вы можете помочь вашему макросу работать быстрее, если отключите (отключите) ScreenUpdating.

Отключить обновление экрана

1. Чтобы отключить ScreenUpdating, в начале кода поместите эту строку:

1 Application.ScreenUpdating = False

Включить обновление экрана

2. Чтобы снова включить ScreenUpdating, в конце кода поместите эту строку:

1 Application.ScreenUpdating = True

Пример обновления экрана VBA

Тогда ваша процедура будет выглядеть так:

1234567891011 Sub ScreenUpdating_Example ()Application.ScreenUpdating = False'Сделай что-нибудьДиапазон («a1»). Копировать диапазон («b1»)Диапазон («a2»). Копировать диапазон («b2»)Диапазон («a3»). Копировать диапазон («b3»)Application.ScreenUpdating = TrueКонец подписки


Обновление экрана Обновить

Отключение ScreenUpdating заставит ваш код VBA работать НАМНОГО быстрее, но это также сделает вашу работу более профессиональной. Конечные пользователи обычно не хотят видеть закулисные действия ваших процедур (особенно, когда процедура выполняется медленно). Кроме того, вы можете не захотеть, чтобы конечные пользователи видели скрытые функции (например, скрытые рабочие листы). Я рекомендую отключить (и снова включить) ScreenUpdating практически во всех ваших процедурах.

Однако бывают случаи, когда вы хотите, чтобы экран обновился. Чтобы обновить экран, вам нужно будет временно снова включить ScreenUpdating (нет команды «обновить» экрана):

123 Application.ScreenUpdating = True'Сделай что-нибудьApplication.ScreenUpdating = False

Настройки VBA - код ускорения

Есть несколько других настроек, с которыми можно поиграть, чтобы улучшить скорость вашего кода.

Отключение автоматических вычислений может ОГРОМНО изменить скорость:

1 Application.Calculation = xlManual

Отключение строки состояния также имеет небольшое значение:

1 Application.DisplayStatusBar = False

Если ваша рабочая книга содержит события, вам обычно следует отключать события в начале процедуры:

1 Application.EnableEvents = False

Наконец, ваш код VBA может замедлиться, когда Excel пытается повторно вычислить разрывы страниц (Примечание: не все процедуры будут затронуты). Чтобы отключить отображение разрывов страниц, используйте эту строку кода:

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

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


Расположение Application.ScreenUpdating = False
Здравствуйте! У меня в модуле есть такой Sub: Sub P_ALL() Call P1 Call P2 Call P3 Call P4.

Дерганье изображения, несмотря на "Application.ScreenUpdating = False"
Добрый вечер. Проблема: после того, как в наружный макрос был вложен макрос, код которого показан.

Help Excel Screenupdating не работает
Собственно сабж Все работает - формы, процедуры Но все отображается :( и соответственно медленно.

Не устанавливается ScreenUpdating = False, всегда остается True
Народ, помогите, плз. Я пытаюсь в VBA выполнить строку: Application.ScreenUpdating = FALSE но.

Ну прыгать по листам и ячейкам не обязательно. Вы и так обращаетесь к ячейкам через ссылку на лист sh17.
Зачем показывать текущий прогресс, если без этих прыжков процедура может работать в несколько раз быстрее?
Если это ну оооочень долго, то прогрессбар можно нарисовать в статусной строке экселя blackfisk, в этом куске программы ScreenUpdating и не встречается. Или вы думаете, что здесь такие продвинутые люди, что, глядя на ваши многочисленные присвоения, догадаются почему ScreenUpdating не так работает? Что ж, попробую. Поставьте оператор DoEvents перед оператором Application.ScreenUpdating = False Если внутри программы есть Application.ScreenUpdating = True, тоже DoEvents вставьте после него. Отпишитесь что и как. Ну прыгать по листам и ячейкам не обязательно. Вы и так обращаетесь к ячейкам через ссылку на лист sh17.
Зачем показывать текущий прогресс, если без этих прыжков процедура может работать в несколько раз быстрее?
Если это ну оооочень долго, то прогрессбар можно нарисовать в статусной строке экселя

Не статусная строка это не солидно, она маленькая и незаметная, я вижу это так:
(Строки обновляются соответственно)

Вся процедура занимает около 4 минут,
но вот когда на комп снисходит озарение и апдейты работают, пролетает за полторы минуты
Кстати, спасибо за работу напрямую с ячейками, это я у Вас подчеркнул

blackfisk, в этом куске программы ScreenUpdating и не встречается. Или вы думаете, что здесь такие продвинутые люди, что, глядя на ваши многочисленные присвоения, догадаются почему ScreenUpdating не так работает? Что ж, попробую. Поставьте оператор DoEvents перед оператором Application.ScreenUpdating = False Если внутри программы есть Application.ScreenUpdating = True, тоже DoEvents вставьте после него. Отпишитесь что и как.

Под спойлером макрос с апдейтом

Добавлено через 6 минут
DoEvents не помог

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

Потому что это рабочий документ, и скидывание всех файлов для корректной работы (как у меня) потребует около 500 мб архива.

Я не могу скинуть файл,
Меня интересует, встречался ли кто с ситуацией, когда Application.ScreenUpdating работает некорректно

Возможно из за кучи формул на листах, глючит, но я ставил расчёт на manual, Не помогало,
делал выдержку в несколько секунд, между листами, тож не помогло

под спойлером тоже нет screenupdating. DoEvets как раз обеспечивает ожидание окончания всех действий, связанных с обменом между экселем и системой без всяких временных выдержек. под спойлером тоже нет screenupdating. DoEvets как раз обеспечивает ожидание окончания всех действий, связанных с обменом между экселем и системой без всяких временных выдержек. Подобных штучек с экраном не наблюдал, но программа вылетала. Вставил в проблемных местах DoEvents - всё заработало нормально. Скопировал код из-под спойлера, вставил в мдуль нового файла и в редакторе попытался найти Upd через Find - Не-а

blackfisk, зачем в каждом макросе выключать и включать ScreenUpdating ?
Выключайте в основном макросе в начале , а в конце включайте.

Добавлено через 5 минут
Попробуйте еще кое-что выключать

blackfisk, зачем в каждом макросе выключать и включать ScreenUpdating ?
Выключайте в основном макросе в начале , а в конце включайте.

Добавлено через 5 минут
Попробуйте еще кое-что выключать

Если я делаю отключение в основном макросе, то всё начинает крошиться, картинка скачет, листы накладываются
если ставить в каждый макрос, то картинка замирает

Если я делаю отключение в основном макросе, то всё начинает крошиться, картинка скачет, листы накладываются
если ставить в каждый макрос, то картинка замирает

К сожалению нет, всё верно

Отключение в главном макросе крошит,
Отключение и включение в "подмакросах" - замораживает картинку

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

Меня интересует, встречался ли кто с ситуацией, когда Application.ScreenUpdating работает некорректно Нет. Вы просто что-то не так делаете. Но, боюсь, без примера файла вам никто не поможет. возможно я могу накатить с нуля, примерный файл но в меньшей дозе информации, щя попробую blackfisk, но чтобы в этом файле с нуля были бы ваши фокусы, иначе смысла нет Меня интересует, встречался ли кто с ситуацией, когда Application.ScreenUpdating работает некорректно пoдрoбнoстей не пoмню, делал маленкий макрoс для кoлеги у кoтoрoгo oфис 2016 и заметил, чтo Application.ScreenUpdating у негo рабoтает как-тo страннo, не так как у меня на oфис 2007 и 2010. Вот из за таких строчек, всё ломалось, я понял, я починилъ, спасибо
теперь вылезли другие ошибки
К примеру, если макрос не находит txt файл для открытия, то апдейты, алерты слетают :/ Да что ж такое

Мигание окон и ошибки отработки скрипта в Word при ScreenUpdating=False
Добрый день! Сразу скажу - про режим отключения обновления экрана при работе vba-скрипта знаю и.

Объясните разницу между Excel.Application.xxx и Application.xxx
Всем привет. Начинаю изучать VBA, планирую пока использовать для эксель. Учусь по книге.

Application.GetSaveAsFilename()?
есть для word'а метод анологичный excel'овскому Application.GetSaveAsFilename()?

Application.Calculation = xlCalculationAutomatic
Здравствуйте, подскажите пожалуйста значение команд: Application.Calculation =.

Не работает Application. Quit
Помогите с проблемой пожалуйста. Есть код в Access который создает файл Excel экспортом данных.

Как такой код выглядит на практике. Предположим, надо записать в цикле в 10 000 строк значения:

Для более опытных пользователей VBA я приведу несколько решений по оптимизации кодов в различных ситуациях:

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

Как отключить обновление экрана для другого приложения (блокнот)

4 Badan [2016-12-09 12:55:00]

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

Не работает с записной книжкой. Я могу использовать только обычный фокус, иначе код не работает. Как я могу выполнить код ниже, не заметив, что файл блокнота открыт и обработан?

Я не мог найти никакого рабочего решения.

excel-vba csv notepad

Вот быстрый ответ, как запустить Notepad, но скрыть окно и использовать vbHide вместо vbNormalFocus в вашей команде Shell :

Но я очень сомневаюсь, что SendKeys будет работать над невидимым окном.

Итак, это не ответ на вопрос, но вы считаете, что используете FileSystemObject и просто читаете файл без фактического открытия Notepad.exe ?

Код будет работать с акцентированными символами, например. мой тестовый текстовый файл:

0 Badan [2016-12-12 11:37:00]

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

How to dou


Расчет листового листа

Знаете ли вы, что каждый раз, когда ячейка, которая влияет на любую формулу в вашей электронной таблице, изменяется или обрабатывается, Excel пересчитывает весь рабочий лист? В таблицах с большим количеством формул это поведение может резко замедлить работу ваших макросов.

Вы можете использовать Приложение. Свойство Calculate, чтобы сообщить Excel переключиться на ручной режим расчета. Когда рабочая книга находится в режиме ручного вычисления, рабочая книга не будет пересчитываться до тех пор, пока вы явно не выполните расчет, нажав клавишу F9.

Поместите Excel в ручной режим расчета, запустите свой код и затем вернитесь в автоматический режим расчета.

Установка режима вычисления обратно в xlCalculationAutomatic автоматически приведет к пересчету рабочего листа, поэтому нет необходимости нажимать клавишу F9 после запуска макроса.

Отключение обновления экрана листа

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

После того, как свойство ScreenUpdating вернётся к True, Excel автоматически вызовет перерисовку экрана.

Отключение обновлений строки состояния

Строка состояния Excel, которая отображается в нижней части окна Excel, обычно отображает ход определенных действий в Excel.Если ваш макрос работает с большим количеством данных, строка состояния займет несколько ресурсов.

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

Указание Excel на игнорирование событий

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

Иногда стандартные макросы вносят изменения, которые вызывают процедуру события. Например, если у вас есть стандартный макрос, который манипулирует несколькими ячейками в Sheet1, каждый раз, когда ячейка на этом листе изменяется, ваш макрос должен приостанавливаться, пока выполняется событие Worksheet_Change.

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

Перед запуском макроса установите для свойства EnableEvents значение False. После того, как ваш макрокоманда закончен, вы можете вернуть свойство EnableEvents значение True.

Скрытие разрывов страниц

Каждый раз, когда ваш макрос изменяет количество строк, изменяет количество столбцов или изменяет настройку страницы рабочего листа, Excel вынужден занять время, перерасчитывая разрывы страниц на листе.

Вы можете избежать этого поведения, просто скрыв разрывы страниц перед запуском своего макроса.

Установите для свойства листа DisplayPageBreaks значение False, чтобы скрыть разрывы страниц. Если вы хотите продолжать показывать разрывы страниц после запуска макроса, установите для свойства листа DisplayPageBreaks значение True.

Приостановка обновлений сводной таблицы

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

Вы можете улучшить производительность своего макроса, приостановив перерасчет сводной таблицы до тех пор, пока не будут сделаны все изменения поля поворота. Просто установите PivotTable. Свойство ManualUpdate для True, чтобы отложить пересчет, запустите свой макрокоманд и затем установите сводную таблицу. Свойство ManualUpdate вернется к False, чтобы вызвать пересчет.

Очистка от копирования и вставки

Важно помнить, что хотя Macro Recorder экономит время, написав код VBA для вас, он не всегда записывает наиболее эффективный код. Ярким примером является то, как Macro Recorder захватывает любое действие копирования и вставки, которое вы выполняете во время записи.

Вы можете немного увеличить свои макросы, вырезав посредника и выполнив прямую копию из одной ячейки в ячейку назначения. Этот альтернативный код использует аргумент Destination для обхода буфера обмена и копирования содержимого ячейки A1 непосредственно в ячейку B1.

Если вам нужно скопировать только значения (не форматирование или формулы), вы можете повысить производительность еще больше, избегая при этом метода копирования. Просто установите значение ячейки назначения на то же значение, которое находится в исходной ячейке. Этот метод примерно в 25 раз быстрее, чем при использовании метода Copy:

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

Использование оператора With

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

Оператор With, используемый в следующем примере, сообщает Excel применять все изменения форматирования за один раз:

Привычка к чередованию действий в операторы With не только ускорит выполнение макросов, но и упростит чтение вашего макрокода.

Избегание метода Select

Macro Recorder предпочитает использовать метод Select для явного выбора объектов, прежде чем предпринимать действия над ними. Как правило, нет необходимости выбирать объекты перед их работой. Фактически, вы можете значительно улучшить производительность макросов, не используя метод Select.

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

Обратите внимание, что ничего не выбрано.Код просто использует иерархию объектов для применения необходимых действий.

Ограничение поездок на рабочий лист

Например, следующий простой код заставляет VBA непрерывно возвращаться к листам («Лист1»). Range («A1»), чтобы получить номер, необходимый для сравнения, выполняемого в инструкции If:

Более эффективным способом является сохранение значения в листах («Лист1»). Range («A1») к переменной MyMonth. Таким образом, код ссылается на переменную MyMonth вместо рабочего листа:

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

Excel vba: Почему обновление экрана не обновляется, прежде чем отключать обновление экрана.

У меня есть суб, который начинается с вызова другого суб (который редактирует ячейки рабочей книги), а затем отключает обновление экрана и предупреждения. Дело в том, что первый юг, который редактирует книгу, находится перед вторым югу, ячейка не обновляется.

Когда я выключаю второй элемент, ячейка обновляется. Как я могу обновить ячейку, а затем отключить обновление экрана?

EDIT: обновление Экран уже верно, когда mainSub начинается; Комментируя setupApp sub out , он помогает, потому что он явно запускается раньше, чем ячейки редактируются несколько позже.

Я действительно не понимаю, почему это не работает. Но вы можете попытаться вызвать SetupApp с помощью инструкции If. Для этого вам нужно привязать editSub к функции и в конце просто вернуть истинное значение. Что-то вроде этого:

Второе решение

Вы можете попытаться форсировать события с DoEvents для обновления экрана.

Или Помещенный DoEvents сразу после того, как вы написаны в клетках.

Если это не работает, вы можете попробовать метод Wait:

Первое решение

ли судимое вам повернуть ScreenUpdating на Перед выполнением Sub?

Копилка знаний…..

Ускоряем выполнение VBA кода, а так же убираем ненужные уведомления (всплывающие окна).

Для того чтобы ускорить выполнение VBA кода в Excel, а так же скрыть мерцание экрана, лишние пересчёты формул, различные уведомления, на которые нужно нажать для продолжения выполнения кода и которые часто раздражают (подтверждение открытия файлов, данные сохраненные как текст и тд), а так же убрать не нужные пересчет формул который происходят постоянно при обновлении данных на которые они ссылаются можно использовать следующие команды, которые нужно добавить или в начало кода или перед конкретным нужным участком (если вы в курсе).

Excel.Application.ScreenUpdating = False ‘убирает обновление экрана. Можно использовать почти всегда — лишняя нагрузка на процессор.

Excel.Application.DisplayAlerts = False ‘убирает всплывающие окна. Совсем. Использовать аккуратно.

Excel.Application.EnablEevents = False ‘убирает обработку событий в Excel. События необходимо отключать для исключения зацикливания или выполнения незапланированных действий. Например при внесении одним макросом значения на лист и лишнего (не нужного) выполнения другого макроса по обработки события добавления значения на лист — который, как вариант, рассчитан на ручной ввод. Использовать только при необходимости.

Excel.Application.Calculation = xlCalculationManual ‘убирает автопересчет формул и зависимых от них объектов. Можно и нужно использовать почти всегда — лишняя нагрузка на процессор, особенно если формулы использующие массивы или поиск.

Не забываем ОБЯЗАТЕЛЬНО все вернуть обратно, чтобы пользователи не ругались = ) :

Читайте также: