Access 2007 VBA代码仅返回循环的第一个记录

时间:2013-12-10 20:07:17

标签: vba loops ms-access-2007

我有两个表,我试图将表B中的数据导入表A.如果在表B中找不到表A的ID,则将其保留为空。 例如。

             AID    Sttl                    BID      Sttl
             4                              88        3
             20                             92        2
             88     3                       100       8 
             92     2                       500       10
             800                            

我目前的代码只返回表A中的第一个类似记录。它不返回下一个匹配记录(例如,它为AID 88返回3但不返回AID92的任何内容)。我错过了什么?

 Dim db As dao.Database
 Dim rs1 As dao.Recordset
 Dim rs2 As dao.Recordset

 Set db = CurrentDb()
 Set rst1 = db.OpenRecordset(cstrFromtbl, dbOpenDynaset)
 Set rst2 = db.OpenRecordset(cstrTotbl, dbOpenDynaset)

Do While Not rs2.EOF
If rs2.Fields("A.ID") = rs1.Fields("B.ID") Then
   rs2.Edit
   rs2.Fields("Sttl") = rs1.Fields("Sttl")
   rs2.Update
Else
   rs2.Edit
   rs2.Fields("Sttl") = Null
   rs2.Update
End If
rs2.MoveNext
Loop

Set rs1 = Nothing
Set rs2 = Nothing
Set dbs = Nothing

End Function

2 个答案:

答案 0 :(得分:2)

我可能错了,但看起来你在VBA中重新创建SQL。下面的SQL更简单,可能运行得更快,更快。

UPDATE tablea
INNER JOIN tableb
ON tablea.idfield = tableb.idfield
SET tablea.destinationfield = tableb.sourcefield

答案 1 :(得分:1)

有许多人忘记了,除了排序之外,你无法确定桌子的顺序。因此,您必须进行搜索,并检查是否找到了某些内容。

Do While Not rs2.EOF
  rs1.FindFirst("ID=" & rs2.Fields("A.ID"))
  rs2.Edit
  If rs1.NoMatch Then
   rs2.Fields("Sttl") = Null
  Else
   rs2.Fields("Sttl") = rs1.Fields("Sttl")
  EndIF
  rs2.Update
  rs2.MoveNext
Loop