MS Access中的VBA:如何加快记录集上的循环操作

时间:2018-11-23 00:54:39

标签: vba performance ms-access

在需要维护的数据库中(MS Access 2010),我使用VBA程序清理记录,具体来说就是:将字段中的值从“是”设置为“否”。该过程遍历所有记录,并根据需要在相应字段中设置值。

到目前为止,我的数据库大约有900条记录。不会太多,应该考虑一下。

我的问题:VBA程序运行非常缓慢。在当前计算机上,我必须等待大约10秒钟,直到循环通过900条记录为止。在日常工作中这是不切实际的。

我需要的:我正在寻找通过代码改进或完全不同的方法来加快此速度的方法。

这是我的程序:

Private Sub WipeSelectionMarks_Click()

'Remove any filter that might be set to reduce the number of records in
'the form - We want here to operate on all records in the database!

   Me.Filter = ""
   Me.FilterOn = False
    'Don't know if we really need two commands here; but at least it works 

'Operate on a recordset that holds all the records displayed in the form
   Dim rs As DAO.Recordset
   Set rs = Me.RecordsetClone
   rs.MoveFirst
   Do Until rs.EOF
      With rs
        .Edit
        !Int_IwSelectMove = False
        .Update
      End With
      rs.MoveNext
   Loop

'Message box with info what has been done 
   MsgBox "A total of " & rs.RecordCount & " records were updated by wiping the Move mark"

'Cleaning up
   Set rs = Nothing
   Me.Refresh

 End Sub

注1:如果解决方案将改用SQL命令,我将不胜感激实用的提示或示例。我仍然在许多地方使用SQL命令,但是在这里正确使用将很有帮助。

注2:或可以以仅记录所关注字段的值为“是”(通常只有900的20-30)和那些“否”的记录的方式重写VBA过程。被排除在外?

2 个答案:

答案 0 :(得分:2)

  

可以仅以记录以下内容的方式重写VBA过程:   该字段的值为“是”已处理

实际上,这可能是最快的方法,因为您不必重新查询表单:

   With rs
       Do Until .EOF
           If !Int_IwSelectMove.Value = True Then
               .Edit
               !Int_IwSelectMove = False
               .Update
           End If
           .MoveNext
       Loop
       .Close
   End With

或者您可以使用FindFirst或过滤的记录集。在表单的记录集上运行SQL通常是最后的选择。

答案 1 :(得分:1)

您可以使用UPDATE命令:

numpy