将 Access 数据库查询复制到 Excel 电子表格中

Posted

技术标签:

【中文标题】将 Access 数据库查询复制到 Excel 电子表格中【英文标题】:Copy Access database query into Excel spreadsheet 【发布时间】:2015-08-13 12:52:40 【问题描述】:

我有一个 Access 数据库和一个 Excel 工作簿。 我需要做的是查询数据库并将查询粘贴到工作表中。

问题是运行时。我已经逐步完成了该程序并且一切正常,但是它运行得非常慢,我们说每个查询最多 30 秒的运行时间,尽管这个运行时间的大部分来自 CopyFromRecordset 调用。

数据库在我正在查询的表中有超过 800k 行。 目前在我公司,每天早上都有人手动查询表格并将它们复制并粘贴到 Excel 中。我正在尝试删除此进程。

这是我所拥有的:

Sub new1()

    Dim objAdoCon As Object
    Dim objRcdSet As Object

    ' gets query information '
    Dim DataArr()
    Sheets("Data2").Activate
    DataArr = Range("A1:B40")

    For i = 1 To UBound(DataArr)

        job = DataArr(i, 1)
        dest = DataArr(i, 2)

        If InStr(dest, "HT") > 0 Then
            OpCode = "3863"
        ElseIf InStr(dest, "HIP") > 0 Then
            OpCode = "35DM"
       End If

       strQry = "SELECT * from [BATCHNO] WHERE ([BATCHNO].[Job]='" & job & "') AND ([BATCHNO].[OperationCode] = " & "'" & OpCode & "')"

       Set objAdoCon = CreateObject("ADODB.Connection")
       Set objRcdSet = CreateObject("ADODB.Recordset")

       objAdoCon.Open "Provider = Microsoft.Jet.oledb.4.0;Data Source = C:\Users\v-adamsje\Desktop\HTmaster.mdb"
       'long run time
       objRcdSet.Open strQry, objAdoCon
       'very long run time
       ThisWorkbook.Worksheets(dest).Range("A2").CopyFromRecordset objRcdSet

      Set objAdoCon = Nothing
      Set objRcdSet = Nothing

   Next i

End Sub

感谢任何帮助。我是 VBA 和 Access 的新手,所以这很容易解决。谢谢

【问题讨论】:

尝试将光标位置设置为客户端:objRcdSet.CursorLocation = adUseClient。您必须在打开记录集之前执行此操作。 已尝试,运行时间仍然相同。还有其他建议吗? 【参考方案1】:

Excel 非常擅长为自己获取数据,而无需使用 VBA。

在数据功能区上

    在某处(例如 mdb 或 SServer)创建与表或数据视图的连接

    然后使用“现有连接”按钮将连接表中的数据添加到工作表表 (ListObject)。

    您甚至可以将工作簿(即连接)设置为每 12 小时刷新一次数据。

对您需要为其抓取数据的所有表/视图重复此操作。您甚至可以将 SQL 指定为连接的一部分。

让 excel 自己照顾自己。

我刚刚在 2 秒内从“附近”磁盘中抓取了一个 250,000 行的表。

它会照顾自己,无需维护代码!

【讨论】:

【参考方案2】:

我不知道如何改进 CopyFromRecordset。您可以以编程方式(在 VB 中)逐个记录地复制记录,但这可能会比 CopyFromRecordset 慢。

您可以将CreateObject 语句移出循环,在已创建连接和 RecordSet 的情况下,这可能会更快:

Set objAdoCon = CreateObject("ADODB.Connection")
Set objRcdSet = CreateObject("ADODB.Recordset")

For i = 1 To UBound(DataArr)
    ...
next i
Set objRcdSet = Nothing
Set objAdoCon = Nothing

您也可以尝试使用 ADO 代替 DAO。 ADO 似乎在大型记录集上执行得更快。

但服务器也可能是一个问题,例如,Job 和 OperationCode 上是否有索引?如果不是,那么缓慢可能是服务器选择记录而不是 Excel 将它们放入工作表中。

【讨论】:

【参考方案3】:

Whelp,从来没有发现为什么 CopyFromRecordset 运行时是晦涩难懂的,但是通过将整个表格拉入 excel 然后放入一个数组中,循环遍历并将它们放在相应的工作表中,解决了我的问题。从 30 分钟运行时间到

【讨论】:

我正要对此发表评论。为什么要在循环内连接数据库并输出查询?因此,您输出 800K 表的次数与循环迭代的次数一样多!顺便说一句,始终从源头开始数据迁移工作。因此,在 MS Access 中运行此输出,这是一个使用 SQL 引擎的强大的数据量处理程序。此外,Access VBA 可以使用 CopyFromRecordset 及其自己的 TransferSpreadsheet 方法调用任何 Excel VBA,而无需启用宏的工作簿。

以上是关于将 Access 数据库查询复制到 Excel 电子表格中的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 获取 Excel 选项卡名称并复制到 Access 表

使用 Python 将数据从 MS Access 复制到 MS Excel

使用 VBA 将 Access 查询链接到 Excel [重复]

将 MS Excel 链接到 MS Access 查询

将 Access 查询导出到 Excel 会带来主键,而不是信息

将查询从 Access 导出到 Excel 模板