比较 VBA Access 中的表

Posted

技术标签:

【中文标题】比较 VBA Access 中的表【英文标题】:Compare tables in VBA Access 【发布时间】:2014-11-14 19:11:49 【问题描述】:

我正在尝试比较 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"") "

【问题讨论】:

您的数据库是否包含名为 DataDump 的表或查询? 不是那个名字,但我用那个名字在 VBA 中打开它,所以它应该没关系吧? 好的,我明白了。 DataDump 是一个记录集对象。不,您不能SELECT FROM 记录集。 哦,我明白了。所以我应该把它改成它在数据库中的表名? 是的,我想你想在那里使用 tableName 变量的值。 【参考方案1】:

首先,你有一个 .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 更有效,除非您的表非常小,并且熟练程度的差异可以忽略不计。

【讨论】:

谢谢!一个问题,我是否可以使用INTO 语句将它们插入到客户表中?如果是这样,我会把它放在哪里? 取决于表是否存在。您可以使用 INSERT INTO 或 SELECT blah blah INTO。是的,你可以很容易地将它添加到 MySql,但是你需要一个 DoCmd.RunQuery 因为它会将它变成一个动作查询。 SELECT ... INTO 是如果表存在,INSERT INTO 是如果表不存在。如果您使用 INSERT INTO,它将在 SELECT 语句之前。如果您使用的是 SELECT ... INTO,那么 INTO 部分将位于 FROM 子句之前。 查看此链接作为示例(如果您查看页面左侧,您还会看到指向 INSERT INTO 语句的链接):msdn.microsoft.com/en-us/library/bb208934(v=office.12).aspx 谢谢!在这种情况下,我会把它放在第一个 FROM 之前对吗?【参考方案2】:

我同意 Johnny 的观点,即查询是更好的选择。 Microsoft Access 实际上有一个内置的查询生成器来执行此操作,并制作了一个教程,可以在下面的链接中找到。这显然不会直接转换为 VBA,但您可以构建查询或在 VBA 代码中使用它。

Find records without matches

【讨论】:

以上是关于比较 VBA Access 中的表的主要内容,如果未能解决你的问题,请参考以下文章

比较两个 Access 数据库 VBA - 唯一连接

如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表

从 Access VBA 中的表中的记录创建查询

使用 VBA (MS Access) 中的 bigint 字段更新 SQL 表

WHERE IN 在 Access VBA 中使用两个记录集进行查询

使用 VBA 在 Access 2010 中的表单上显示记录集