Как создать диалоговое окно состояния в Excel
Вопрос
Я создал генератор отчетов базы данных в Excel.Я пытаюсь создать диалоговое окно, в котором будет отображаться информация о состоянии во время работы программы.
Когда я создаю отчет, хотя диалоговое окно появляется, я не могу обновить/обновить отображаемую в нем информацию.В большинстве случаев диалоговое окно отображается лишь частично.Я пробовал использовать метод .repaint, но результаты все равно те же.Я вижу полное диалоговое окно только после создания отчета.
Решение
Приведенный ниже код хорошо работает при выполнении действий в Excel (XP или более поздней версии).
Для действий, которые происходят за пределами Excel, например, подключения к базе данных и получения данных, лучшее, что это предлагает, — это возможность отображать диалоговые окна до и после действия (например, «Получение данных», «Получил данные»)
Создайте форму под названием "фрмстатус", поместите метку на форму под названием "Ярлык1".
Установите свойство формы 'ШоуМодал' = ложь, это позволяет выполнять код во время отображения формы.
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
Другие советы
Попробуйте добавить DoEvents позвоните в свой цикл.Это должно позволить форме перерисовываться и принимать другие запросы.
Я использовал собственную строку состояния 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
Надеюсь это поможет!
Вставьте пустой лист в свою рабочую книгу Переименовать лист, например."информация"
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")
И т. д
Диалоговое окно также работает в том же потоке пользовательского интерфейса.Итак, он слишком занят, чтобы перекрашивать себя.Не уверен, что VBA имеет хорошие возможности многопоточности.