我已经发布了一个关于在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)放在函数的开头,看它是否有任何区别。它没有。
答案 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)