Ms access 访问VBA循环(无响应)
我在一个记录集中循环执行一些基本功能或编辑 通常,对于记录超过50条的记录集,access将停止响应 在loop命令之前,我有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
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查询)将替换循环代码。