【问题标题】:Compare rows in a spreadsheet with records in a database将电子表格中的行与数据库中的记录进行比较
【发布时间】:2009-06-30 18:00:30
【问题描述】:

我有一个 Excel 电子表格作为报告提供,实际上它更像是一个数据库,行号作为主键。我需要将此集中的某些列与 Access 2007 数据库中的另一组记录进行比较。更复杂的是,这需要定期自动完成,无需用户输入。

从电子表格中获取数据的最佳方式是什么,以及进行比较的最佳方式是什么。至于从电子表格中获取数据,ACEDAO 似乎是最好的选择,因为这是 Excel 2007,但 MSDN 没有关于如何使用 DAO/ACEDAO 查询 Excel 的信息,只能使用 DAO/ACEDAO 导出到 Excel。至于运行比较,除了比较每个条目的每一列之外,我想不出更好的方法。

【问题讨论】:

  • 这是一次性流程吗?如果是这样,您可以使用 Access 将 Excel 工作表导入 Access DB,并使用 Access QBE 工具创建 SQL 查询以生成所需的报告。
  • 这不是一次性的过程;它按设定的时间表重复。

标签: sql excel ms-access vba


【解决方案1】:

如果没记错的话,您可以创建一个链接到 Excel 电子表格的表格。将其链接到 Access 后,您可以像对待任何其他表一样对待它。

进行比较的查询看起来像这样(见下图)。它将从 Excel 电子表格中返回不匹配的行(右键单击图片并将其保存到您的计算机以获得更清晰的视图)。

就自动化而言,如果您愿意保留一份运行的 Access,您可以set up a Timer in a form。如果没有,您将不得不使用Office Automation。有关 C# 中的“hello world”示例,请参见此处:
http://rnarayana.blogspot.com/2008/02/access-2007-office-automation-using-c.html

【讨论】:

  • 感谢办公自动化的想法。我计划在启动时运行为更新提供动力的宏,并使用批处理文件在 Access 中启动该数据库。
  • 我在查询中创建了这个结构(从spreadhseet到表的JOIN LEFT,其中ID为NULL);但是,它未通过 Is Null 测试并返回所有记录,而不是表中不存在的记录。
  • 为了从输出集中省略一行,每个连接都必须匹配两边的值。是否有可能其中一个连接点指向一侧的错误字段?从一个连接开始,观察空集,然后一次添加一个连接,边做边测试。
  • 上述结构有效,错误来自不同的来源(测试数据而不是 SQL 查询)。但是,当表中有其他列不在链接表中时,怎么可能朝另一个方向发展(返回表中不在链接表中的所有记录)。
【解决方案2】:

使用 ACE,您可以直接查询工作簿,例如

SELECT S1.seq AS seq_ACE, 
       S2.seq AS seq_Excel
  FROM Sequence AS S1
       LEFT OUTER JOIN [Excel 12.0;Database=C:\Test.xlsx;].Sequence AS S2
          ON S1.seq = S2.seq;

【讨论】:

    【解决方案3】:

    如果 Excel 工作表的结构为列表,那么 ADO 可能是要走的路 - 更多信息 here


    编辑:这里有几种不同的可能方法

    • 在 Excel 中使用 ADO 从 Access 数据库中读取数据,并使用 VBA 将返回的值与 Excel 工作表进行比较。可能只对相对较小的记录集进行简单比较有用

    • 如 Robert Harvey 的回答中所述,将 Excel 工作表设为 Access 数据库中的链接表,并使用 Access 本身使用 SQL 进行查询

    • 使用 ADO 和 ADOX 使 Excel 工作表成为 Access 数据库中的链接表,并在 Excel 中使用 ADO 使用 SQL 进行查询

    我没有意识到 DAO 重新与 Access 2007 一起使用。由于我使用 Excel 连接到数据库,DAO 已被弃用多年(ADO 是首选的连接方法)。我现在知道得更多了

    【讨论】:

    • 在上一个问题中,我问过ADO还是DAO哪个更好,DAO是回应,因为ACEDAO是Access 2k7中ACEDB的标准:stackoverflow.com/questions/1039224/…
    • 在回答 那个 问题时,我回答(解释)你不应该只使用 ACEDAO 或只使用 ADO,而是使用在任何给定情况下最有意义的那个。在超过 99% 的情况下,两者之间没有显着差异。这是软件工程,而不是哲学:)
    • ADO 和 ACEDAO 记录集是否兼容?
    • '兼容'?答案是否定的,但为什么你认为这很重要?
    • 如果它们是兼容的(即:混合它们让 ADO 对象读取一个 ACEDAO 记录集),那么区别并不重要;但是对于当前的项目,这确实很重要,因为需要使用一个。
    【解决方案4】:

    我知道我会为此受到抨击,因为它不是很“程序员”,但如果这是一次性的并且生成的 Access 表只是一些查询的数据的临时工作副本您可以直接将数据复制/粘贴到数据表视图中的表格中。

    这是一种快速、肮脏、简洁的方法,但它很有效,而且只需要很少的额外工作。

    注意:如果表真的很大或者正在被其他人使用,你可能不想这样做。它可能会很慢并且会引入大量锁定。

    【讨论】:

    • 它也可能对目标数据类型产生不可预测的结果。但是您可以一次性将其添加到组合中。
    • 我已经使用它一百万次来处理诸如“您可以使用附件电子表格中列出的产品代码之一删除 TableX 中的所有项目吗?”之类的请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2020-06-15
    相关资源
    最近更新 更多