我在Excel中创建了一个数据库报告生成器。我正在尝试创建一个对话框,在程序运行时显示状态信息。
当我生成报告时,虽然出现了对话框,但我无法刷新/更新它显示的信息。大多数情况下,对话框仅部分显示。我试过使用.repaint方法,但我仍然得到相同的结果。生成报告后,我只看到完整的对话框。
答案 0 :(得分:6)
尝试在循环中添加 DoEvents 调用。这应该允许表格重新绘制&接受其他请求。
答案 1 :(得分:4)
我使用了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 :(得分:2)
以下代码在Excel(XP或更高版本)中执行操作时效果很好。
对于在Excel外部发生的操作,例如连接到数据库并检索数据,最好提供的是在操作之前和之后显示对话框的机会(例如“获取数据”,< em>“有数据”)
创建名为“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
答案 3 :(得分:2)
在工作簿中插入空白工作表 重命名工作表例如。 “信息”
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")
等
答案 4 :(得分:0)
该对话框也在同一UI线程上运行。所以,它太忙了,不能重新粉刷自己。不确定VBA是否具有良好的多线程功能。