Принудительное обновление экрана в Excel VBA - PullRequest
26 голосов
/ 17 сентября 2010

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

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

For i=1 to imax ' imax is usually 30 or so
    fractionDone=cdbl(i)/cdbl(imax)
    Application.StatusBar = Format(fractionDone, "0%") & "done..."
    ' or, alternatively:
    ' statusRange.value = Format(fractionDone, "0%") & "done..."

    ' Some code.......

Next i

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

Ответы [ 5 ]

35 голосов
/ 17 сентября 2010

Добавьте функцию DoEvents внутри цикла, см. Ниже.

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

Sub ProgressMeter()

Dim booStatusBarState As Boolean
Dim iMax As Integer
Dim i As Integer

iMax = 10000

    Application.ScreenUpdating = False
''//Turn off screen updating

    booStatusBarState = Application.DisplayStatusBar
''//Get the statusbar display setting

    Application.DisplayStatusBar = True
''//Make sure that the statusbar is visible

    For i = 1 To iMax ''// imax is usually 30 or so
        fractionDone = CDbl(i) / CDbl(iMax)
        Application.StatusBar = Format(fractionDone, "0%") & " done..."
        ''// or, alternatively:
        ''// statusRange.value = Format(fractionDone, "0%") & " done..."
        ''// Some code.......

        DoEvents
        ''//Yield Control

    Next i

    Application.DisplayStatusBar = booStatusBarState
''//Reset Status bar display setting

    Application.StatusBar = False
''//Return control of the Status bar to Excel

    Application.ScreenUpdating = True
''//Turn on screen updating

End Sub
10 голосов
/ 19 декабря 2011

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

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

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

- ActiveSheet.Calculate    
- ActiveWindow.SmallScroll    
- Application.WindowState = Application.WindowState
9 голосов
/ 17 сентября 2010

Поместите вызов в DoEvents в цикле.

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

1 голос
/ 18 марта 2013

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

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

В коде UserForm это так просто:

Me.Repaint
0 голосов
/ 17 сентября 2010

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

Application.ScreenUpdating = False
Application.EnableEvents = False

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

Application.ScreenUpdating = True
Application.EnableEvents = True

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

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