【问题标题】:How to show progress on status bar when running code (not queries)运行代码时如何在状态栏上显示进度(不是查询)
【发布时间】:2015-01-08 16:16:17
【问题描述】:

我已经发布了一个关于在 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

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

当我运行它时,状态栏首先显示“就绪”。有一个暂停,大概是在代码运行 Loop 1 时。然后它显示“Before loop 2”,最后显示“Before loop 3”。

为什么不显示“Before loop 1”?

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

【问题讨论】:

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


    【解决方案1】:

    在每次调用 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)
    

    【讨论】:

    • 这太完美了!非常感谢 - 这让我发疯了。我也感谢您使用常量和 Sleep 函数 - 使代码更简洁。
    • 不客气。该睡眠功能在 32 位 VBA 中很有用。我怀疑它可能需要针对 64 位 VBA 进行更改,但我还没有处理这个问题。
    • 只有一个问题:你为什么在末尾使用 SysCmd acSysCmdSetStatus, " " 而不是 SysCmd 5?
    • 当时我不记得acSysCmdClearStatus。但我更喜欢它并更新了使用它的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多