如何在运行代码时显示状态栏上的进度(不是查询)

时间:2015-01-08 16:16:17

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

我已经发布了一个关于在MS Access 2010中运行查询时更新状态栏的问题。如果您有兴趣,请参阅How to show progress on status bar when running a sequence of queries in MS Access

这是一个非常简单的问题,关于一些不起作用的代码。我希望如果有人能够回答它,这可能有助于我理解为什么更复杂的问题的代码不起作用。

Function PutMessageInStatusBar1()

Dim RetVal As Variant
Dim i As Long

RetVal = SysCmd(4, "Before loop 1")
For i = 1 To 500000000
Next

RetVal = SysCmd(4, "Before loop 2")
For i = 1 To 500000000
Next

RetVal = SysCmd(4, "Before loop 3")
For i = 1 To 500000000
Next
RetVal = SysCmd(5)

End Function

我写了一个宏来运行代码。它首先关闭警告,然后调用上面的功能,显示一个消息框说“"已完成"然后打开警告。

当我运行它时,状态栏首先显示" Ready"。有一个暂停,大概是代码运行循环1.然后它显示"在循环2"最后"在循环3"。

之前

为什么它不显示"在循环1"?

之前

我尝试将RetVal = syscmd(5)放在函数的开头,看它是否有任何区别。它没有。

1 个答案:

答案 0 :(得分:2)

每次DoEvents来电后致电SysCmd。这将指示Windows在您的代码前进之前更新显示。

在此功能中,每个状态栏消息在显示下一个状态栏消息之前都可见。

Function PutMessageInStatusBar2()
    Const lngMilliseconds As Long = 1000

    SysCmd acSysCmdSetStatus, "Before loop 1"
    DoEvents
    Sleep lngMilliseconds
    SysCmd acSysCmdSetStatus, "Before loop 2"
    DoEvents
    Sleep lngMilliseconds
    SysCmd acSysCmdSetStatus, "Before loop 3"
    DoEvents
    Sleep lngMilliseconds
    SysCmd acSysCmdSetStatus, "Done."
    DoEvents
    Sleep lngMilliseconds

    SysCmd acSysCmdClearStatus

End Function

Sleep基于Windows API方法,并在标准模块的声明部分中声明:

Option Compare Database
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)