ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2926|回复: 26

[讨论] 为什么使用SQL获取工作表数据的速度比普通方法更慢?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-12 09:49 | 显示全部楼层 |阅读模式
要打开一个65535行的Excel表,并提取数据到数组中。
用ADO处理的时间竟然是普通处理方法(Workbooks.Open)的4倍以上。
是不是我的代码有问题啊?请大神们看看。

关键代码如下:
  1. strSQL = "SELECT * FROM [Sheet1$]"
  2. T0 = Timer
  3. Cnn.Open str_Cnn & aryWb(1)
  4. Brr = Cnn.Execute(strSQL).GetRows()
  5. Cnn.Close
  6. T1 = Format(Timer - T0, "0.0000")

  7. T0 = Timer
  8. Set Wb = Workbooks.Open(aryWb(1))
  9. Crr = Wb.Worksheets("Sheet1").UsedRange
  10. Wb.Close False
  11. T2 = Format(Timer - T0, "0.0000")

  12. Set Cnn = Nothing
  13. Set Wb = Nothing
  14. Debug.Print T1, T2
复制代码
结果为:
2.9375        0.6875

【补充】如果打开的Excel文档比较小的话,用ADO打开处理还是要比workbooks.Open要快的。

TA的精华主题

TA的得分主题

发表于 2023-5-12 11:14 | 显示全部楼层
是你的实验验证过程有问题!

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-12 11:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
WANT-T 发表于 2023-5-12 11:14
是你的实验验证过程有问题!

能具体说明是哪里有问题吗?

TA的精华主题

TA的得分主题

发表于 2023-5-12 14:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-12 15:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
铁了心抗日 发表于 2023-5-12 14:52
实测65536行,SQL获取快。

谢谢,能提供一下代码和Excel表吗?我也跑一下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-12 15:50 | 显示全部楼层
铁了心抗日 发表于 2023-5-12 14:52
实测65536行,SQL获取快。

这个表要超过10列,才会有明显差别。列数越多,差别越大。

TA的精华主题

TA的得分主题

发表于 2023-5-12 16:00 | 显示全部楼层
代码如下,数据自己模拟吧,超过10列依然是SQL快。

Sub test()
    Set cnADO = CreateObject("ADODB.Connection")
    strSQL = "SELECT * FROM [Sheet1$]"
    T0 = Timer
    cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Extended Properties=Excel 12.0;" _
        & "Data Source=" & ThisWorkbook.Path & "\total.xls"
    Brr = cnADO.Execute(strSQL).GetRows()
    cnADO.Close
    T1 = Format(Timer - T0, "0.0000")
   
    T0 = Timer
    Set Wb = Workbooks.Open(ThisWorkbook.Path & "\total.xls")
    Crr = Wb.Worksheets("Sheet1").UsedRange
    Wb.Close False
    T2 = Format(Timer - T0, "0.0000")
   
    Set Cnn = Nothing
    Set Wb = Nothing
    Debug.Print T1, T2
End Sub

TA的精华主题

TA的得分主题

发表于 2023-5-12 23:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我只知道超过万行的数据用sql就对了,毕竟sql能处理千万行数据

TA的精华主题

TA的得分主题

发表于 2023-5-13 08:22 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-13 11:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
铁了心抗日 发表于 2023-5-12 16:00
代码如下,数据自己模拟吧,超过10列依然是SQL快。

Sub test()

7.9805        0.9609

6万行数据,我的电脑跑的结果。不知道问题出在哪里了?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 08:25 , Processed in 0.043492 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表