我正在尝试比较VBA访问中的两个表,以查看是否有一个需要添加到另一个中的新客户端。我开始开发比较循环但由于某种原因它不起作用。它表示客户端ID字段对于一个表中的所有记录的值为6,这不是真的。我不确定我是否在If
声明中引用它。对此主题的任何帮助将不胜感激。
dte = InputBox("What date was the Data Dump run?", "Please Input a date")
tableName = "FN_DataDump_ALL_" & dte
Set dataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
With dataDump
.MoveFirst
Do
If dataDump("[Client ID]") <> clientTable("[Client ID]") Then
MsgBox (dataDump("[Client ID]"))
clientTable.MoveNext
Else: MsgBox ("Match.")
.MoveFirst
End If
Loop Until .EOF
End With
更新:
出于某种原因,VBA一直说它无法正确地打开DataDump表,而且正确地打开了所有内容。我试图运行SQL时抛出此错误,所以我认为我的声明有问题。
Set db = CurrentDb
dte = InputBox("What date was the Data Dump run?", "Please Input a date")
tableName = "FN_DataDump_ALL_" & dte
Set DataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
MySQL = "SELECT DISTINCT CL.[Client ID] " & _
"INTO Clients " & _
"FROM Clients AS CL " & _
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] FROM DataDump AS DD) "
更新#2:
现在它说我有语法错误,我真的很困惑它是什么。
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] ""FROM"" & tableName ""as DD"") "
答案 0 :(得分:3)
首先,你有 .MoveFirst ,你应该有一个 .MoveNext
但是,更好的方法是使用NOT IN查询。我会这样做:
tableName = "FN_DataDump_ALL_" & dte
Set dataDump = db.OpenRecordset(tableName, dbOpenDynaset, dbEditAdd)
Set clientTable = db.OpenRecordset("Clients", dbOpenDynaset, dbEditAdd)
MySQL = "SELECT DISTINCT CL.[Client ID] " & _
"INTO TempClients " & _
"FROM Clients AS CL " & _
"Where CL.[Client ID] NOT IN (SELECT DD.[Client ID] FROM " & tableName & " AS DD) "
DoCmd.RunSQL (MySQL)
现在,您已在数据集中获得名为“rec”的客户端ID列表。这比循环遍历每个记录和比较ID更有效,除非你的表非常小,然后熟练程度的差异可以忽略不计。
答案 1 :(得分:0)
我同意约翰尼的观点是一个更好的选择。 Microsoft Access实际上有一个内置的查询构建器来执行此操作,并制作了一个教程,可以在下面的链接中找到。这显然不会直接转换为VBA,但您可以构建查询或在VBA代码中使用它。