如何在Excel中创build状态对话框

我在Excel中创build了一个数据库报告生成器。 我正在尝试创build一个对话框,在程序运行时显示状态信息。

当我生成报告时,虽然出现对话框,但我无法刷新/更新显示的信息。 大多数情况下,对话框只是部分出现。 我曾尝试使用.repaint方法,但我仍然得到相同的结果。 报告生成后,我只能看到完整的对话框。

下面的代码在Excel(XP或更高版本)中执行操作时效果很好。

对于在Excel之外发生的操作,例如连接到数据库并检索数据,这个提供的最好的机会是在操作之前和之后显示对话(例如“获取数据” 获取 数据”

创build一个名为“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 

尝试在你的循环中添加一个DoEvents调用。 这应该允许窗体重新绘制并接受其他请求。

我使用了Excel自己的状态栏(在窗口左下angular)来显示我过去开发的类似应用程序的进度信息。

如果你只是想显示进度的文本更新,并且完全避免需要更新对话框,那么它会很好地工作。

好的@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") 

继续macros

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

继续macros

等另外,也可以在现有工作表的某处select一个空白单元,而不是插入一个新工作表

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

等等

该对话框也在同一UI线程上运行。 所以,它太忙了,不能重画自己。 不确定VBA是否具有良好的multithreadingfunction。