我在Windows 7中的MS Access 2010中有一个宏,它运行一系列相当慢的Make Table和Update查询。我希望它在状态栏上显示它正在运行的查询,因为通常的消息“运行查询”不提供查询名称。
我写了以下VBA:
Function RunQueryAndReportStatusWithMsgBox(QueryName As String)
Dim RetVal As Variant
On Error GoTo ErrHandler
PutStatusBarBack
MsgBox "About to run query"
Application.Echo False, "Executing " & QueryName & " ..."
DoCmd.OpenQuery QueryName, acViewNormal, acEdit
On Error GoTo 0
Exit Function
ErrHandler:
Select Case Err
Case 2501: ' OpenQuery cancelled by the user pressing escape
MsgBox "The OpenQuery action for query " & QueryName & " was cancelled by the user."
Case Else: ' Another error has occurred.
' Display the error number and the error text.
MsgBox "Error # " & Err & " : " & Error(Err)
End Select
' Put status bar back to normal.
PutStatusBarBack
End Function
Function PutStatusBarBack()
Dim RetVal As Variant
On Error GoTo ErrHandler
' Put status bar back to normal.
RetVal = SysCmd(5) ' not sure if I need this.
Application.Echo True, ""
On Error GoTo 0
Exit Function
ErrHandler:
' Display the error number and the error text.
MsgBox "Error # " & Err & " : " & Error(Err)
' Put status bar back to normal.
RetVal = SysCmd(5) ' not sure if I need this.
Application.Echo True, ""
End Function
我编写了一个宏来调用RunQueryAndReportStatusWithMsgBox
,每个查询依次作为参数,然后我在宏的末尾调用PutStatusBarBack
。我在开始和结束时关闭警告。这非常有效 - 就像我想要的那样。
但是,每次查询开始时,我都不希望在消息框上按“确定”。如果我注释掉MsgBox
语句,它就不再起作用了。结果是可变的。有时它会在状态栏中显示某些内容,有时则不会。刚刚运行时,我只是收到了“就绪”消息,但有时我会在某些但不是所有查询中显示所需的消息。
我尝试使用RefreshDatabaseWindow
代替MsgBox
,但这没有任何区别。
答案 0 :(得分:3)
刚才偶然发现了这一点,所以它很可能太少,太晚了,但请确保在每次迭代过程中,在更改状态栏后调用DoEvents。这告诉您的过程将控制权返回给应用程序和Windows一秒钟,这就是它如何更改状态栏文本。这也是你如何让Access无法回应它的方式。
答案 1 :(得分:2)
感谢HansUp在回答我之后发布的类似问题(How to show progress on status bar when running code (not queries))时给予的帮助,我现在可以自己回答这个问题了。
要使代码在不调用MsgBox的情况下工作,您需要在调用Application.Echo之前放两行:
RetVal = SysCmd(4, "Executing " & QueryName & " ...")
DoEvents
现在这正是我想要的。
答案 2 :(得分:1)
对应@ Zajonc对Hauns TM回答的评论。
它发生了,因为这一行:
RetVal = SysCmd(5)
这意味着:刷新状态栏。
有关MS Access中状态栏的更多信息:ACC: How to Change the Status Bar Text Using SysCmd()
因此,直到第一个程序工作,不刷新状态栏;)
For i = 1 to 10
SysCmd(4, "Running query " i & " of " & 10)
'your code here...
RunQueryAndReportStatusWithMsgBox(...)
Next
'here you should refresh status bar ;)
干杯,
马切伊
答案 3 :(得分:0)
我不确定这是你在找什么?也许:
Dim statusText As String
Dim statusPercent As Integer
statusText = "Yada yada..."
statusPercent = 100 / 500 * 100
Application.StatusBar = "Progress: " & statusText & "(" & Cstr(statusPercent) & " %)" 'Progress: Yada yada... (20 %)
即。每当您希望更改时,都会更改Application.StatusBar
中的作业。