访问VBA循环(无响应)

时间:2015-11-02 09:16:04

标签: vba ms-access access-vba

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

通常记录集的记录超过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 

3 个答案:

答案 0 :(得分:3)

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

e.g。

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

LastName相同。

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

答案 1 :(得分:3)

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

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

有一个小的表现权衡。如果不调用DoEvents,循环的总执行时间会稍短,但Access将不执行任何其他操作,然后处理循环。因此它似乎没有回应。

答案 2 :(得分:3)

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

{{1}}

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