Как создать диалоговое окно состояния в Excel

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

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


person JonnyGold    schedule 09.09.2008    source источник


Ответы (5)


Приведенный ниже код хорошо работает при выполнении действий в 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
person Robert Mearns    schedule 18.09.2008
comment
Это работает даже когда Application.ScreenUpdating = False - person KurtisT; 18.05.2020

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

person Mark Biek    schedule 09.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

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

person Galwegian    schedule 09.09.2008
comment
Я знаю, что это старый пост, но отличное решение. Спасибо! - person Alan; 20.07.2020

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

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")

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

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

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

Так далее

person Richard Knott    schedule 22.06.2013

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

person Gulzar Nazim    schedule 09.09.2008