我想通過使用序列號作爲主鍵來比較兩個表。由於它們的大小可能不同,因此序列號可能在SerialAccount_b中,而不在SerialAccount_a中。發生這種情況時,由於一個記錄集提前,而另一個記錄集試圖找到序列號,所以我會到文件末尾。然後它返回錯誤3021.我有它的錯誤處理,但我希望代碼繼續比較其他數據發生這種情況後,我遇到麻煩這樣做。如果你能幫助我,那會很棒。如果您對如何改進此子程序有任何其他建議,那也不錯。處理錯誤3021(EOF)VBA
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
代碼有效。這只是處理這個錯誤。使用SQL不會幫助我,因爲我現在無法像使用數據那樣使用數據,因爲它只返回行。如果我錯了,請糾正我。 – heinst
我已添加到我的答案。您似乎在數據庫研究中跳過了一些內容:SQL語句,表連接,條件(WHERE子句)。循環遍歷整個表並測試每一行很少(如果有的話)是必要的。 –