作者:绿色风
分类:
时间:2022-08-18
浏览:103
楼主 ldy |
这个查询语句是特意写成这样的,效率很低,不考虑优化的问题。 同样的代码在不同的环境下运行效果差异非常大。
- 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 |
2楼 xyh9999 |
果然如版主所说,会造成内存无法释放! 学习!向版主致敬! |
3楼 xyh9999 |
后来我又将楼主的成果做了些测试,用您说的方法果然很好,但又有了一个新问题: 如果data source所指的源文件是加过密的Excel文件,即便已经打开了该文件,用您的方法(即先欺骗成只读文件,用过后再改为可读写文件)就取不到数据或出错,如果不用您的方法(即文件状态一直处于可读写状态)可以取到数据,但内存不能释放,用多了就死机。 直得庆幸的是对于没有设密码的Excel文件,您的方法十分奏效!请楼主再帮助想想以上问题有没有什么好的解决办法,多谢。 |
4楼 水星钓鱼 |
学习下。 |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一