|
这个查询语句是特意写成这样的,效率很低,不考虑优化的问题。
同样的代码在不同的环境下运行效果差异非常大。
- Sub 查询()
- Dim conn As New ADODB.Connection
- Dim SQL As String
- Dim rc As New ADODB.Recordset
- t = Timer
- conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName
- SQL = "select a.* from ((select * from [sheet1$]) as a left join (select * from [sheet1$]) as b on a.aa<>b.aa)"
- rc.Open SQL, conn, 1, 3
- Debug.Print rc.RecordCount
- rc.Close
- conn.Close
- Set rc = Nothing
- Set conn = Nothing
- MsgBox Timer - t
- End Sub
复制代码 ADO连接自身时有个严重的BUG,多次运行查询语句是会造成内存无法释放,并且会内存占用迭加。
所以有经验的人会尽量避免这种情况,分为两个文件,一个储存数据,一个运行代码。
但很多时候,又不得不进行“ADO 连接自身”这样的操作。那如何解决这个问题就成了一个很头痛的事情。
既然分为两个文件,只要不是“ADO 连接自身”就不会有这个BUG,那么我们可以写几句代码骗一骗EXCEL。-
- Sub 欺骗式查询()
- Application.ScreenUpdating = False
- Application.DisplayAlerts = False
- ThisWorkbook.ChangeFileAccess xlReadOnly '转为只读
- 查询
- ThisWorkbook.ChangeFileAccess xlReadWrite
- Application.DisplayAlerts = True
- Application.ScreenUpdating = True
- End Sub
复制代码 ThisWorkbook.ChangeFileAccess xlReadOnly
关键代码就这一句,实现了欺骗效果,
其他两句作用屏蔽 屏幕刷新,避免出现“只读”字样;禁止提示,避免出现询问对话框
看一下两个程序的运行10次的后效果----内存占用相差 10倍。
ado.rar
(40.15 KB, 下载次数: 821)
|
评分
-
6
查看全部评分
-
|