Как создать диалоговое окно статуса в Excel - PullRequest
3 голосов
/ 09 сентября 2008

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

Когда я генерирую отчет, хотя диалоговое окно появляется, я не могу обновить / обновить отображаемую информацию. В большинстве случаев диалоговое окно появляется только частично. Я пытался использовать метод .repaint, но все равно получаю те же результаты. Полное диалоговое окно отображается только после создания отчета.

Ответы [ 5 ]

6 голосов
/ 09 сентября 2008

Попробуйте добавить DoEvents вызов в вашем цикле. Это должно позволить форме перекрасить и принять другие запросы.

4 голосов
/ 09 сентября 2008

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

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

Хорошо @JonnyGold, вот пример того, что я использовал ...

Sub StatusBarExample()
    Application.ScreenUpdating = False 
    ' turns off screen updating
    Application.DisplayStatusBar = True 
    ' makes sure that the statusbar is visible
    Application.StatusBar = "Please wait while performing task 1..."
    ' add some code for task 1 that replaces the next sentence
    Application.Wait Now + TimeValue("00:00:02")
    Application.StatusBar = "Please wait while performing task 2..."
    ' add some code for task 2 that replaces the next sentence
    Application.Wait Now + TimeValue("00:00:02")
    Application.StatusBar = False 
    ' gives control of the statusbar back to the programme
End Sub

Надеюсь, это поможет!

2 голосов
/ 22 июня 2013

Вставьте чистый лист в вашу рабочую книгу Переименовать лист например. "Информация"

Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")

Продолжить макрос

Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")

Продолжить макрос

Etc Или выберите пустую ячейку где-нибудь на существующем листе вместо вставки нового листа

Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")

Etc

2 голосов
/ 18 сентября 2008

Приведенный ниже код хорошо работает при выполнении действий в Excel (XP или более поздняя версия).

Для действий, выполняемых за пределами Excel, например, для подключения к базе данных и извлечения данных, лучшее, что это предлагает, - это возможность показывать диалоги до и после действия (например, «Получение данных» , "Получил данные" )

Создайте форму с именем "frmStatus" , поместите метку в форму с именем "Label1" .

Установить свойство формы 'ShowModal' = false , это позволяет запускать код во время отображения формы.

Sub ShowForm_DoSomething()

    Load frmStatus
    frmStatus.Label1.Caption = "Starting"
    frmStatus.Show
    frmStatus.Repaint
'Load the form and set text

    frmStatus.Label1.Caption = "Doing something"
    frmStatus.Repaint

'code here to perform an action

    frmStatus.Label1.Caption = "Doing something else"
    frmStatus.Repaint

'code here to perform an action

    frmStatus.Label1.Caption = "Finished"
    frmStatus.Repaint
    Application.Wait (Now + TimeValue("0:00:01"))
    frmStatus.Hide
    Unload frmStatus
'hide and unload the form

End Sub
0 голосов
/ 09 сентября 2008

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

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