기본 키로 일련 번호를 사용하여 두 테이블을 비교하려고합니다. 크기가 다를 수 있기 때문에 일련 번호는 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 절)을 조금 건너 뛴 것처럼 보입니다. 전체 테이블을 반복하고 각 행을 테스트하는 것은 거의 필요하지 않습니다. –