Насколько установка этих свойств ускоряет работу макроса Excel: Application.ScreenUpdating, Application.DisplayAlerts - PullRequest
6 голосов

какой смысл делать это:

Application.ScreenUpdating = False
Application.DisplayAlerts = False

это действительно экономит столько времени?

Ответы [ 5 ]

14 голосов
/ 29 мая 2010

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

Каждый раз, когда вы что-то меняете на листе, 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
5 голосов
/ 22 сентября 2011

Согласен.

Я обнаружил, что когда вы выключаете ScreenUpdating, Calculation, лучше всего подумать о том, как выполнить как можно больше работы (записи, чтения, события и т. Д.) Для как можно меньшего количества людей ScreenUpdating звонки в ответ.Это ускорит операции, а также предоставит пользователю лучший и более терпимый опыт.Скажем, например, что вы хотите записать некоторые данные на лист как можно быстрее.Вы могли бы сделать это:

For Each row In rowDic.Keys()
    ' turn off updating
    for item in rowDic.Key(row)
        ... do some writes
    Next             
    ' turn on updating
Next

или, чтобы пойти быстрее, вы можете сделать это:

' turn off updating
For Each row In rowDic.Keys()
    for item in rowDic.Key(row)
        ... do some writes
    Next             
Next
' turn on updating

Точно так же, когда пишете данные, быстрее написать большие куски, меньше раз.таким образом, идеальное количество записей, если оно есть, равно единице.Вы можете сделать это, рассматривая Range как 2D array[rows,cols].Я считаю следующее эффективным:

' turn off updates

' Organise data in ram so that it fits the range for which it is meant
Dim two_d_arr (rows,cols)
loadDataFromSource two_d_arr

Dim destinationRange as Range
destinationRange = Sheets(someSheet).Range(someRange).Value = two_d_arr

Redim two_d_arr(0,0) ' !!! RELEASE MEMORY
' turn on updates

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

HTH,

F

5 голосов
/ 29 мая 2010

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

4 голосов
/ 27 мая 2010

Абсолютно. Несколько лет назад у меня был длительный макрос, который занял почти минуту. Я установил для ScreenUpdating значение false, и оно завершилось менее чем за 5 секунд.

Просто убедитесь, что вы сбросили ScreenUpdating в true, когда закончите запуск макроса.

3 голосов
/ 29 мая 2010

Я бы не использовал их для «скорости», но для «функции»

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

Application.ScreenUpdating = False

Если вы не хотите, чтобы пользователь видел каждое лишнее сообщение из приложения:

Application.DisplayAlerts = False 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...