如何在MS Access中运行一系列查询时显示状态栏上的进度

时间:2015-01-04 12:14:49

标签: access-vba ms-access-2010 statusbar

我在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,但这没有任何区别。

4 个答案:

答案 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中的作业。