Ms access 访问VBA循环(无响应)

Ms access 访问VBA循环(无响应),ms-access,vba,Ms Access,Vba,我在一个记录集中循环执行一些基本功能或编辑 通常,对于记录超过50条的记录集,access将停止响应 在loop命令之前,我有me.repaint,但窗口始终冻结,访问标题栏显示:…(无响应) 你知道怎么解决这个问题吗 谢谢 戴夫 编辑:添加循环代码 If Me.Dirty = True Then Me.Dirty = False Dim rs As DAO.Recordset Set rs = Me.Guardians_Subform1.Form.Recordset Dim strFirst

我在一个记录集中循环执行一些基本功能或编辑

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

在loop命令之前,我有
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 
如果Me.Dirty=True,那么Me.Dirty=False
Dim rs作为DAO.Recordset
Set rs=Me.guarders\u子表单1.Form.Recordset
Dim strFirstName,strLastName作为字符串
如果不是(rs.EOF和rs.BOF),则
先走一步
直到rs.EOF=真
rs.编辑
strFirstName=Trim(StrConv(rs!FirstName,3))
strLastName=Trim(StrConv(rs!LastName,3))
如果是的话!FirstName strFirstName然后
rs!FirstName=strFirstName
如果结束
如果是的话!LastName strLastName然后
rs!LastName=strLastName
如果结束
rs.更新
下一个
我,重新油漆
环
其他的
MsgBox“记录集中没有记录。”
如果结束
设置rs=无

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

e、 g

更新TBLGuardian
SET FirstName=Trim(StrConv(FirstName,3))
其中StrComp(FirstName,Trim(StrConv(FirstName,3)),0)0
LastName
也一样


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

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

e、 g

更新TBLGuardian
SET FirstName=Trim(StrConv(FirstName,3))
其中StrComp(FirstName,Trim(StrConv(FirstName,3)),0)0
LastName
也一样

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

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

Do Until rs.EOF = True
  [...]
  rs.MoveNext
  DoEvents
Loop  
有一个小的性能权衡。如果不调用DoEvents,循环的总执行时间将稍微缩短,但Access将不做任何其他事情,然后处理循环。因此,它似乎没有响应。

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

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

有一个小的性能权衡。如果不调用DoEvents,循环的总执行时间将稍微缩短,但Access将不做任何其他事情,然后处理循环。因此,它似乎没有响应。

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

Dim iCounter as Integer

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

这可以防止DoEvents太频繁地触发并导致整个代码变慢。根据您认为合适的迭代调整计数器。

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

Dim iCounter as Integer

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

这可以防止DoEvents太频繁地触发并导致整个代码变慢。根据您认为合适的迭代次数调整计数器。

嗨,戴夫,请您提供相应的代码。我们将更容易帮助您。此外,access应该能够处理大小为的记录集。你的记录有多大?上一个记录集的记录少于100条。我已经添加了循环代码。谢谢为什么不运行一个update语句来修剪字段值呢?嗨,Dave,请提供代码。我们将更容易帮助您。此外,access应该能够处理大小为的记录集。你的记录有多大?上一个记录集的记录少于100条。我已经添加了循环代码。谢谢为什么不运行一条update语句来修剪字段值呢?我同意,一条SQL语句通常比循环一个记录集来编辑多个记录要好得多。-但是这个答案并没有解决在处理循环时冻结访问的一般问题。谢谢!所以我应该做一些类似的事情:DoCmd.RunSQL“UPDATE tblGuardians SET Firstname=Firstname=Trim(StrConv(Firstname,3)),其中ID=“&rs!”![ID]&“@DaveB:不,这个查询不在记录集循环中运行,这就是重点。它一次更新所有记录。此查询(加上LastName查询)是循环代码的替代。我同意,一条SQL语句通常比通过记录集循环编辑多条记录要好得多。-但是这个答案并没有解决在处理循环时冻结访问的一般问题。谢谢!所以我应该做一些类似的事情:DoCmd.RunSQL“UPDATE tblGuardians SET Firstname=Firstname=Trim(StrConv(Firstname,3)),其中ID=“&rs!”![ID]&“@DaveB:不,这个查询不在记录集循环中运行,这就是重点。它一次更新所有记录。此查询(加上LastName查询)将替换循环代码。