我正在创建一个循环遍历大量单元格的VBA脚本(708),并在每个单元格上运行2个SQL查询。
我遇到的问题是代码需要相当长的时间才能完成。最重要的是,应用程序经常停止响应并发送“无响应”消息。
以下是我的代码的一部分。还有另一种几乎完全相同,但占据不同的细胞范围。这两个数据库都查询两个数据库 - 总共4次运行此代码。
Code Exerpt:
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
是在代码的另一部分中找到的变量,它只是一个日期范围,没什么特别的。
如果有更有效的方法来完成这项任务?
答案 0 :(得分:4)
这样做的效率要高得多。每行查询两次数据库非常“健谈”。处理此问题的最佳方法是编写一个或两个包含所有行所需数据的查询,将结果返回到后台选项卡,然后使用vlookup匹配所需的数据。
这种方法摆脱了对数据库的所有不必要的往返,并且作为奖励消除了VBA代码中的循环,这也是低效的。