访问 VBA 循环(无响应)

Posted

技术标签:

【中文标题】访问 VBA 循环(无响应)【英文标题】:Access VBA Loop (Not Responding) 【发布时间】:2015-11-02 09:16:04 【问题描述】:

我正在遍历记录集以执行一些基本功能或编辑。

通常对于超过 50 条记录的记录集,访问将停止响应。

我在循环命令之前有me.repaint,但窗口总是冻结并且访问标题栏显示:...(未响应)。

知道如何解决这个问题吗?

谢谢。

戴夫。

编辑:添加循环代码

If Me.Dirty = True Then Me.Dirty = False
Dim rs As DAO.Recordset
Set rs = Me.Guardians_Subform1.Form.Recordset

Dim strFirstName, strLastName As String

If Not (rs.EOF And rs.BOF) Then
    rs.MoveFirst 

    Do Until rs.EOF = True     
rs.Edit
    strFirstName = Trim(StrConv(rs!FirstName, 3))
    strLastName = Trim(StrConv(rs!LastName, 3))
    If rs!FirstName <> strFirstName Then
    rs!FirstName = strFirstName
    End If

    If rs!LastName <> strLastName Then
    rs!LastName = strLastName
    End If

     rs.Update
       rs.MoveNext
Me.Repaint
    Loop  
Else
    MsgBox "There are no records in the recordset."
End If
Set rs = Nothing 

【问题讨论】:

嗨,戴夫,请您提供此代码。我们会更容易为您提供帮助。 此外,访问应该能够处理最大为1gig 的记录集。你的记录有多大? 最后一个记录集少于 100 条记录。我已经添加了循环代码。谢谢! 为什么不只运行一个更新语句来修剪字段值? 【参考方案1】:

正如其他人指出的那样,您可以使用 DoEvents 释放您的处理器以在继续之前执行其他操作。当我在循环中使用 DoEvents 时,我使用了一个计数器。

Dim iCounter as Integer

Do Until
' some code here
   iCounter=iCounter+1
   If iCounter = 100 then
      DoEvents
      iCounter=0
   End if
Loop

这可以防止 DoEvent 过于频繁地触发并导致您的整体代码变慢。将计数器调整为您认为合适的任何迭代。

【讨论】:

【参考方案2】:

您需要在循环中调用DoEvents-Function 以将控制权传递给操作系统以重绘您的Access-GUI 并处理可能需要处理的任何其他窗口消息。这样,应用程序将不会在任务管理器和标题栏中标记为“未响应”。

Do Until rs.EOF = True
  [...]
  rs.MoveNext
  DoEvents
Loop  

有一个小的性能折衷。如果不调用 DoEvents,则循环的总执行时间会短一些,但 Access 将不执行任何其他操作,然后处理您的循环。因此它似乎没有响应。

【讨论】:

【参考方案3】:

使用记录集循环进行此类编辑并不是最好的方法。 UPDATE 查询效率更高。

例如

UPDATE tblGuardians
SET FirstName = Trim(StrConv(FirstName, 3))
WHERE StrComp(FirstName, Trim(StrConv(FirstName, 3)), 0) <> 0

LastName 也是如此。

这使用StrComp 而不是简单的&lt;&gt; 比较,因为后者不区分大小写。第三个参数0=vbBinaryCompare

【讨论】:

我同意,单个 SQL 语句通常比通过记录集循环编辑多条记录要好得多。 - 但是这个答案并没有解决处理循环时访问冻结的一般问题。 谢谢!所以我应该这样做: DoCmd.RunSQL "UPDATE tblGuardians SET Firstname = FirstName = Trim(StrConv(FirstName, 3)) WHERE ID =" & rs![ID] & ";" @DaveB:不,这个查询不在记录集循环中运行,这就是重点。它一次更新所有记录。此查询(加上姓氏查询)是循环代码的替换

以上是关于访问 VBA 循环(无响应)的主要内容,如果未能解决你的问题,请参考以下文章

C# winform程序出现界面无响应

AFNetworking - 除了 for 循环中的最终请求外,其他所有请求均无响应

springboot 服务卡死 连接池查询无响应问题解决

Flash 网络摄像头访问请求提示无响应

选择框中的选项无响应

Android\iOS 相机权限 - 移动用户无响应