3

我有一个循环遍历表的 VBA 脚本,它工作正常,除了它运行代码时访问冻结。代码运行后,它会解冻并显示所有内容(vba 执行了所需的操作,它会打开编码后的最终查询等)

到目前为止这还不错,因为我已经实现(或想要实现)VBA 脚本的“进度状态”功能。这是因为由于新的要求,正在分析的表从大约 4,000 条记录跃升至大约 50,000 条记录。

我通过使用在每条记录后刷新的简单模式对话框表单来完成此操作。

模态对话框最初打开:

DoCmd.OpenForm ("ProgressReport")
Forms("ProgressReport").Controls("ProgressLabel").Caption = "0 of " & RecordCount & " records analyzed."

然后在每次迭代之后:

RecordsAnalyzed = RecordsAnalyzed + 1
Forms("ProgressReport").Controls("ProgressLabel").Caption = RecordsAnalyzed & " of " & RecordCount & " records analyzed."
Forms("ProgressReport").Repaint

是否可以将“内存”分配给模态表单,这样即使 Access 冻结,它也会保持活动状态?代码稍微复杂一点,但它只是 Do Until (EOF) 和 If 语句 - 非常基本的 VBA 函数。关于如何让这个进度条工作的任何想法?没有或没有模态对话框。

我已经研究过编辑状态栏,但是考虑到访问冻结,这也不起作用。

4

2 回答 2

4

你需要的是DoEvents声明。

这样做是让 CPU 队列中的其他项目运行。这会减慢你的应用程序,但你会重新控制你的应用程序。

将命令放在其中一个循环中。

顺便说一句,很容易过度使用 DoEvents。这篇SO 帖子会告诉你更多。

于 2013-05-15T06:25:53.187 回答
1

DoEvents,正如汤姆所说,让 Windows 有机会更新显示应该很有用。通过不调用DoEvents50K 行中的每一行来限制性能影响。而是选择一些合理的间隔,比如每 100 行,并在该间隔更新进度。

考虑调整此框架代码中概述的策略。我只是用来Debug.Print显示进步。

Public Sub ShowProgress()
    Const lngInterval As Long = 100
    Dim RecordsAnalyzed As Long
    For RecordsAnalyzed = 1 To 500
        If RecordsAnalyzed Mod lngInterval = 0 Then
            ' update progess here ...
            Debug.Print RecordsAnalyzed & " records analyzed"
            DoEvents
        End If
    Next
End Sub
于 2013-05-15T16:14:08.287 回答