какой смысл того, чтобы делать их:
Application.ScreenUpdating = False
Application.DisplayAlerts = False
это действительно экономит так много времени?
Совершенно верно. Несколько лет назад у меня был давно работающий макрос, на выполнение которого у меня уходила почти минута. Я установил для ScreenUpdating значение false, и он завершился менее чем за 5 секунд.
Просто убедитесь, что вы сбросили ScreenUpdating на true, когда закончите запуск макроса.
Улучшение screenUpdating во многом зависит от того, как написан ваш макрос. Это будет особенно полезно с теми ужасными макросами, которые делает диктофон, полными ненужных «выбрать» и «активировать».
Я бы использовал их не для "скорости", а для "функции"
Когда вы не хотите, чтобы пользователь видел обновление экрана:
Application.ScreenUpdating = False
Когда вы не хотите, чтобы пользователь видел каждое лишнее сообщение от приложения:
Application.DisplayAlerts = False
Особенно последнее, потому что никто не хочет быть забит до смерти сообщениями с вопросом, действительно ли вы хотите обновить, добавить или удалить записи. Я предпочитаю оградить пользователя от таких вещей.
Это зависит от того, сколько на самом деле вы обновляете на экране как часть кода (т. Е. Количество обновленных ячеек), и сколько листов там, сколько листов / ячеек ссылается на лист, который обновляется в вашем коде, и как много формул присутствует во всей книге.
Каждый раз, когда вы меняете что-то в таблице, Excel пересчитывает все формулы. Поэтому, если ваш код не обновляет слишком много листов / ячеек, но в вашей книге много формул, отключение обновления экрана может вам вообще не помочь.
Еще одна вещь, которую следует учитывать для повышения производительности, - это свойство Calculation, установите для него значение xlCalculationManual, чтобы отключить автоматическое пересчет и вернуть его в конце к xlCalculationAutomatic.
Application.Calculation = xlCalculationManual
Еще одна вещь, которую следует учитывать, - это события, если на одном или нескольких из этих листов есть обработчики событий Worksheet_Chnage или Worksheet_Calculate, каждое изменение, которое делает ваш код, вызовет их, и ваш код должен ждать, пока они не вернутся. Так что выключите его во время кода.
Application.EnableEvents = False
В большей части моего кода я обычно использую эту
On Error GoTo lblError
Dim bEvents As Boolean, iCalc As Integer, bScrnUpd As Boolean
bEvents = Application.EnableEvents
iCalc = Application.Calculation
bScrnUpd = Application.ScreenUpdating
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'-----------------------My code
Application.EnableEvents = bEvents
Application.Calculation = iCalc
Application.ScreenUpdating = bScrnUpd
Exit Sub
'reset them even if you are exiting due to error
lblError:
Application.EnableEvents = bEvents
Application.Calculation = iCalc
Application.ScreenUpdating = bScrnUpd
Debug.print Err.Description