处理错误3021(EOF)VBA

时间:2013-07-24 20:01:04

标签: vba ms-access access-vba

我试图通过使用序列号作为主键来比较两个表。由于它们的大小可能不同,序列号可能在SerialAccount_b中,而不在SerialAccount_a中。当发生这种情况时,我到达文件的末尾,因为一个记录集前进而另一个记录集试图找到序列。然后它返回错误3021.我有错误处理,但我希望代码恢复到比较其他数据后发生这种情况,我很难这样做。如果你能帮助我,那就太好了。如果您对如何改进这个子程序有任何其他建议,那也很好。

Public Sub compareSerialAccount()

Dim dbs As DAO.Database
Dim rstA As DAO.Recordset
Dim rstB As DAO.Recordset
Dim rstFiltered As DAO.Recordset
Dim serialNumber As String
On Error GoTo HandleErrors

Set dbs = CurrentDb
counter1 = 0
' Opens the recordsets of SerialAccount_a and _b in
' preperation for comparison of data
Set rstA = dbs.OpenRecordset("SerialAccount_a", dbOpenDynaset)
Set rstB = dbs.OpenRecordset("SerialAccount_b", dbOpenDynaset)

Do Until rstB.EOF

Do Until rstA.EOF
    If rstA.Fields("serial") = rstB.Fields("serial") Then
        If rstA.Fields("accountnumber") <> rstB.Fields("accountnumber") Then
            ' Print message
            counterForMessage = counterForMessage + 1
        End If
        If rstA.Fields("model_number") <> rstB.Fields("model_number") Then
            ' Print message
            counterForMessage = counterForMessage + 1
        End If
    Else
    ' This will always be the default until there are two matching serial numbers
    ' This will advnace rstA +1 and make rstFiltered stay put
    ' I had to work around the advancements on the outside of this statement
    ' Thats why I move rstA (+1 = 1) and rstFiltered (-1 +1 = 0)
        rstB.MoveNext
        rstA.MovePrevious
    End If
    rstA.MoveNext
Loop
rstB.MoveNext
Loop

If counterForMessage = 0 Then
Debug.Print "| There are no discrepancies between SerialAccount_a and SerialAccount_b!                                 |"
End If

HandleErrors:
Select Case Err.Number

    Case 3021
    serialNumberForError = rstA.Fields("serial")
    Debug.Print "| Serial number " & serialNumberForError & " was either added or deleted."
    Resume Next

End Select

End Sub

1 个答案:

答案 0 :(得分:3)

我不知道你为什么这样做。即使使用查找不匹配的查询向导,您也可以在Access中创建查询。这将在一个表中找到那些不在另一个表中的记录。如果您还希望在第二个表中找到不在第一个表中的那些,则可以创建其中两个。

如果您希望以编程方式执行此操作,请借用向导创建的SQL语句,并研究table-joins

已添加以回复评论: 您正在根据表名打开记录集。它们包含每个表中的所有数据。您可以改为使用仅检索数据(来自行)的SQL语句,其中表的一个字段中的值不会出现在另一个表的字段中,以及您需要的任何其他条件。您可以像现在一样遍历结果记录集,但记录集将只包含您感兴趣的行。您可以检查RecordCount以确认是否检索到任何记录。