使用VBA运行多个SQL查询(Oracle)-为什么这么慢?

使用VBA运行多个SQL查询(Oracle)-为什么这么慢?,sql,oracle,vba,excel,Sql,Oracle,Vba,Excel,我编写了一个简单的VBA代码来运行多个SQL查询。结果应该放在excel表格上。问题是这个过程需要很长时间才能完成!事实上,逐个运行这些查询要快得多。谁能告诉我如何使它工作得更快 这是我的密码: Const strCon As String=“Driver={Microsoft ODBC for Oracle};”和_ “CONNECTSTRING=(DESCRIPTION=“&”_ “(地址=(协议=TCP)”和_ “(主机=xxxx)(端口=xxx))”&_ (连接数据=(SID=RTD))

我编写了一个简单的VBA代码来运行多个SQL查询。结果应该放在excel表格上。问题是这个过程需要很长时间才能完成!事实上,逐个运行这些查询要快得多。谁能告诉我如何使它工作得更快

这是我的密码:

Const strCon As String=“Driver={Microsoft ODBC for Oracle};”和_
“CONNECTSTRING=(DESCRIPTION=“&”_
“(地址=(协议=TCP)”和_
“(主机=xxxx)(端口=xxx))”&_
(连接数据=(SID=RTD));uid=xxxx;pwd=xxxx
子运行脚本()
作为整数的Dim r
Dim con作为ADODB连接
将rs设置为ADODB.Recordset
将q1设置为字符串
Dim q2作为字符串
Dim q3作为字符串
Set con=New ADODB.Connection
Set rs=New ADODB.Recordset
q1=工作表(“数据”).范围(“i28”).值
设置rs=con.执行(q1)
工作表(“ACCV查询”).Range(“A2”).CopyFromRecordset rs
设置rs=无
r=工作表(“ACCV查询”).范围(“A65536”).结束(xlUp).行
'下一个SQL查询
q2=工作表(“数据”).范围(“j28”).值
设置rs=con.执行(第2季度)
工作表(“ACCV查询”).Range(“A”和“r”).CopyFromRecordset rs
设置rs=无
r=工作表(“ACCV查询”).范围(“A65536”).结束(xlUp).行
'下一个SQL查询
q3=工作表(“数据”).范围(“k28”).值
设置rs=con.Execute(第三季度)
工作表(“ACCV查询”).Range(“A”和“r”).CopyFromRecordset rs
结案
设置con=Nothing
设置rs=无
端接头
SQL查询存储在单元格中,并命名为q1、q2等(所有查询都有效)

当我运行两个这样的查询时,它工作得很好,但一旦我启动了15个。。。宏从未完成工作。每个SQL脚本都需要几秒钟的时间来运行,因此应该可以快速运行

我怎样才能使它工作得更快? 救命啊

非常感谢!
M.

通常,让Excel变慢的是不断的屏幕更新和重新计算。无论何时更改单元格内容,它都会重新计算并刷新屏幕。对于大的插入,这确实会减慢操作速度。幸运的是,您可以关闭此功能

在函数的顶部,放置:

Application.Calculation = xlManual
Application.ScreenUpdating = False
然后在函数末尾(以及在任何错误处理中),放入:


您是否有可能达到Excel中的行限制?如果您使用的是2003,则限制为65k行。请分别检查每个查询。代码中没有任何内容表明它会感谢您的评论@Pynner查询有效-我手动检查了每个查询,结果都很好。当我只运行其中两个时,效果很好,当有更多行时会出现问题,比如10行左右。@Jim不幸的是,情况并非如此,所有查询的结果组合起来不超过300行:(谢谢你的评论!谢谢Chris!我忘记了。刚才添加的,我将运行一个检查,看看它是否有帮助。不幸的是,这还不够,仍然有15个脚本宏从未停止运行:(我注意到记录集的大小会产生差异——如果某个查询返回了很多行——这就是宏将“挂起”的地方。我有“Set rs=Nothing”,但也许我应该添加其他内容?另一件事是我有“Set rs=New ADODB.recordset”只有一次,在顶部-也许应该在每个查询之前添加-这会有不同吗?您是否使用调试器运行它以查看哪些行导致延迟?嗨,Chris,不,我没有,我对调试器不太熟悉..以前从未使用过。我今天将尝试它!谢谢!
Application.Calculation = xlAutomatic
Application.ScreenUpdating = True