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

How to show progress on status bar when running code (not queries)

我已经发布了关于在 MS Access 2010 中运行查询时更新状态栏的问题。如果您有兴趣,请参阅

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

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

我写了一个宏来运行代码。它首先关闭警告,然后调用上述函数,显示一个消息框说 "Finished",然后打开警告。

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

为什么不显示"Before loop 1"?

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

在每次 SysCmd 调用后调用 DoEvents。这将发出信号 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)