我正在使用excel vba从MS Access DB中提取数据-这是使用Excel 2013和Access 2013 32位。代码历史上使用过:
Provider=Microsoft.Jet.OLEDB.4.0;然而,一些计算机已经升级到Excel 2016 64位,而Jet provider不能用于64位。我已将代码更改为:
Provider=Microsoft.ACE.OLEDB.12.0;它适用于64位和32位系统。然而,我注意到仅仅是因为更改了这一行,加载/保存数据的速度就显著下降了。有没有人知道为什么会这样,以及我如何改进它?
发布于 2019-03-23 09:46:04
您必须为x64 bits选择,这是正确的。
而JET的最大优势在于,它过去(现在仍然是)默认安装在所有windows副本上。因此无需安装Access或运行时,或以前的办公连接软件包。
至于性能呢?关于ACE x64的性能,有一些评论。
但是,一个技巧或建议是确保连接保持打开。换句话说,您确定行处理速度很慢,还是整个时间都在变慢?
(可能会放入一个测试消息框,或者在代码中进行测试。
例如:
Dim T as single
T = timer()
‘ your code here
Debug.print timer() – t因此,上面的命令将显示调试窗口的时间(在VBA中,ide按ctrl-g以显示立即/调试窗口。
我建议强制开放的原因是,你经常会发现ACE需要很长时间才能打开。但是一旦打开,那么数据读取就会有很好的性能(和以前一样)。
因此,我建议检查并尝试此修复。
因此,打开一个表(任何表)并使其保持打开。现在运行您现有的代码(这很可能打开或关闭其他表)。问题是,当ACE试图打开一个表时,它会试图锁定mdb/accdb文件,而这个过程需要非常非常长的时间。
但是,如果您强制(保留)打开一个表,则每次执行查询或在代码中创建额外的记录集时,ACE尝试锁定文件以进行读/写的这一非常缓慢的过程不会发生。
因此,如果行读取速度很快,但START + open的时间非常慢,那么在运行+测试例程之前,强制打开某个reocrdset表(保持其活动并在作用域内),然后尝试您的代码。
我发现10次中有9次,这会消除这种缓慢的速度,而且我经常看到结果是惊人的(它会比以前跑得更快!)
https://stackoverflow.com/questions/55302206
复制相似问题