将 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 [重复]