我希望在运行60秒以上的查询时显示“请等待”表单。我有查询和表单(很容易),除了宏不会把它们放在一起。这是我的autoexec宏:
问题是我只能在maketable查询运行时看到我的等待表单的大纲。我只能猜测宏在进入下一步之前不会等待表单完全加载。
Wait表单有一个Timer,显示经过的秒数。如何在仍然允许表单同时更新自身的同时运行查询?
Repaint
仅在继续查询之前更新背景颜色。我也尝试了连续6次重绘,没有任何区别(我认为这可能会解决你们提到的错误)。表格非常简单。单个文本框,使用“加载”作为控制源和计时器功能(暂时禁用)。以下是我的宏观细节:
答案 0 :(得分:1)
首先,你需要Repaint
等待表单显示它才能正确显示,它只是VBA中的一个错误,有时会导致表单无法正确显示,即使它们是正确绘制的在代码中指出。
其次,如果您将等待表单的ShowModal
属性设置为false,那么您将能够通过例程更新它。我使用一个公共函数,它使用0-100参数来更新进度条。这在循环中效果最佳,您可以正常计算剩余循环次数并提供准确的过程进度指南,但即使执行一系列操作,您也可以计时并将合适的值传递到进度表单以便用户随时了解情况。这比大多数Windows进度条都好!
答案 1 :(得分:0)
第一个问题很容易解决,试着把我。在查询运行之前重写。有时访问可能会让屏幕绘画变得有点懒,你必须强制它。
至于另一件有点复杂的事情。您必须异步执行查询。您可以通过在执行查询时添加adAsyncExecute选项在ADO中执行此操作。然后,您将捕获整理事件以告知用户查询已完成
以下是Microsoft知识库http://support.microsoft.com/kb/262311
上的链接答案 2 :(得分:0)
如果您正在使用Action Query,则可以使用vba-function跟踪已执行行的数量,该函数返回传递给它的相同值。当然,你必须知道总行数,知道查询何时完成或显示进度(这通常可以使用轻量级计数查询*相对快速地实现。)
'first some global vars to keep track of the number
Dim lngCurrentRow as Long
Dim lngTotalRows as Long 'We assume lngTotalRows have been set elsewhere
'Here is the function
Public Function UpdateProgress(FieldValue as Variant) as Variant
lngCurrentRow = Nz(lngCurrentRow, 0)
If (lngCurrentRow >= lngTotalRows) then
MsgBox "Query Done!"
Else
'Do stuff to show progress
End If
lngCurrentRow = lngCurrentRow + 1
End Function
为了显示进度,我使用了一个未绑定的表单,一个带有透明背景的空文本字段(progressFrame)和一个带有蓝色背景并位于左侧文本框后面的标签(progressLabel)。对于每次调用UpdateProgress,您都可以设置标签的宽度:
progressLabel.Width = progressFrame.Width * (lngCurrentRow / lngTotalRows)
*:F.ex。如果查询基于一个表,并添加了一些数据,那么查询将产生的记录数等于表的数量,可以单独对表进行计数,以使其更快.. < / p>
我希望这有用,或者至少鼓舞人心:)
答案 3 :(得分:0)
我遇到了与弹出窗体相同的问题,它在显示文本之前花了几秒钟通知用户正在处理某些内容,所以请稍等。我在打开表单的代码之后和运行更新查询的下一段代码之前添加了下面的代码行(这需要一段时间,因此需要通知用户正在处理的内容)
DoCmd.RepaintObject acForm,&#34; frmMyForm&#34;
完美适合我。