目标:我正在编写一个循环,逐行遍历一个表,评估字段是否彼此匹配,然后移至下一条记录(行)并重新评估。我最终希望从中构建一个不断增长的字符串,但是现在我无法使代码进入下一个循环。值表明该代码仅求值第一条记录,然后重复自身。
我已经尝试过将“ ExDif.MoveNext”行移至循环中/从循环结束之前/之后移出循环。
Option Compare Database
Option Explicit
Sub Export_Library_Compare_Process()
'Identify the variables
Dim Tang As DAO.Database
Dim ExDif As DAO.Recordset
Dim Field01a As DAO.Field
Dim Field01b As DAO.Field
Dim ID As DAO.Field
'Set the database and recordsets to database and tables
Set Tang = CurrentDb
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Set Field01a = ExDif.Fields("a_Client Name")
Set Field01b = ExDif.Fields("b_Client Name")
Set ID = ExDif.Fields("ID")
'Start a series to look to see what matches
Do While Not ExDif.EOF
'Move to first row in table
ExDif.MoveFirst
'Field 01 - Client Name
If Field01a.Value <> Field01a.Value Then
MsgBox "Client Name does not match"
Else: MsgBox "Client Name matches"
'Move to next record (row) in table
ExDif.MoveNext
'End the Else - If
End If
'End Loop
Loop
答案 0 :(得分:0)
我在工作中遇到一些不寻常的安全限制,我将此归咎于此工作不起作用。但是我看了一些Access编程板,发现了这篇帖子[https://access-programmers.co.uk/forums/showthread.php?t=171138],让我知道我可以使用“ Do While”或“ Do Before”进行循环。当我尝试将循环样式切换为“直到”时,效果很好。
执行直到ExDif.EOF
答案 1 :(得分:0)
几个问题。
Set ExDif = Tang.OpenRecordset("Staging_LOG_ExportDifferences") Set Field01a = ExDif.Fields("a_Client Name") Set Field01b = ExDif.Fields("b_Client Name") Set ID = ExDif.Fields("ID")
此代码在知道有记录之前开始读取记录集。如果记录集为空(即记录集同时为BOF
和EOF
),则这些后续分配将因错误而失败。这些分配应该在记录读取器循环内。
ExDif.MoveFirst
您已经已经在第一条记录上了;在每次迭代中无条件地将光标移回第一条记录的原因就是循环停留在第一条记录上的原因。删除此行。
If Field01a.Value <> Field01a.Value Then
此表达式将始终取值为False
,这是一个启发式常量表达式,可能是拼写错误。是将Field01a
与Field01b
进行比较吗?
Else: MsgBox "Client Name matches" 'Move to next record (row) in table ExDif.MoveNext 'End the Else - If End If
此缩进非常容易引起误解,而且非常容易出错。考虑:
Else
MsgBox "Client Name matches"
ExDif.MoveNext
End If
现在,.MoveNext
是有条件的(有点-有关条件表达式的更多信息),是一个问题:无论循环体中发生了什么,您都希望完成后的下一条记录。因此.MoveNext
绝不应该是有条件的。
这应该解决它:
Set exportDiffs = Tang.OpenRecordset("Staging_LOG_ExportDifferences")
Do Until exportDiffs.EOF
Dim clientNameA As String
clientNameA = exportDiffs.Fields("a_Client Name").Value
Dim clientNameB As String
clientNameB = exportDiffs.Fields("b_Client Name").Value
If clientNameA <> clientNameB Then
'client name mismatch
GoTo Skip
End If
Dim id As Long
id = exportDiffs.Fields("ID").Value
' do stuff...
Skip:
exportDiffs.MoveNext
Loop