SQL查询代码非常慢,经常失败

我正在创build一个遍历大量单元的VBA脚本(708),并在每个单元上运行2个SQL查询。

我遇到的问题是代码需要花费相当多的时间才能完成。 最重要的是,应用程序经常停止响应并发送“不响应”消息。

以下是我的代码的一部分。 还有一个几乎完全一样的,但占据不同的细胞范围。 这两个都查询两个数据库 – 共计这个代码的4次运行。

代码执行:

cn.Open strConnection For i = 2 To 433 strSql = "SELECT Sum(counts) FROM ( SELECT SUM([Time down]) as counts FROM tblDailyDowntimeMach WHERE [Operation] ='" & Cells(i, "B").Value & "' AND [Type of Maintenance] = 'Breakdown' " & Filter & " UNION ALL SELECT SUM([Time down]) as counts FROM tblDailyDowntimeAssy WHERE [Operation] = '" & Cells(i, "B").Value & "' AND [Type of Maintenance] = 'Breakdown'" & Filter & ");" Set rs1 = cn.Execute(strSql) If IsNull(rs1.Fields(0)) Or rs1.Fields(0) = 0 Then GoTo NextRow End If Cells(i, "D").Value = rs1.Fields(0) NextRow: Next I 

filter是另一个只是date范围的代码中find的variables,没有什么特别的。

如果有更有效的方法来完成这项任务?

有一个显着更有效的方式来做到这一点。 查询数据库每行两次是非常“健谈”。 处理这个问题的最佳方法是编写一个或两个包含所有行所需数据的查询,将结果返回到后台选项卡,然后使用vlookup来匹配所需的数据。

这种方法摆脱了所有不必要的往返数据库,并作为奖金消除了VBA代码中的循环,这也是效率低下。