ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: zhaogang1960

[Excel 程序开发] 字段不完全相同的多个工作簿按工作表名汇总[已小结]

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-1-31 23:40 | 显示全部楼层
本帖最后由 xmyjk 于 2012-1-31 23:42 编辑
wcymiss 发表于 2012-1-31 23:22
按照你的代码测试下来,是adox那段比较快,可是openschema慢在Set rst1 = Nothing和cnn.Close这两句上。这 ...

又测试了一下,最最最影响速度的还是cnn.Close那句,删了那句就差了非常非常多。

呵呵,之前赵老师有说过"用ADO法循环连接工作簿时,通常使用一个变量cnn,连接下一个工作簿前要关闭上一个连接,需要付出一定时间,如果每个工作簿都有一个连接变量cnn1、cnn2……同时连接,等到程序结束时再统一关闭连接,释放内存,这样可以大大提高速度,但是带来的就是占用内存,经与冻版主协商,并采用冻版主的建议——进行极限测试,数据源工作簿改为49个,每个工作簿只有1个40000行数据的工作表后进行测试,同时连接法在连接第27个工作簿时因内存不足报错,常规法则没有报错。每个得高分的算法都有可能成为人们解决此类问题的范例,因此,应该避免使用采用同时连接法。"

不过说实在的,貌似没有cnn.close好像是内存发生无法释放的问题,SET NOTHING能释放内存么?,要不还是请赵老师集体解说下吧,就是ADO结束时,有必要去.close吗?貌似不需要.close效率反而更高啊。。。直接set nothing不就玩了,为啥主流的教材都是说要.close然后set noting呢?

另外,ADOX有TABLE_TYPE可以排除表的类型,貌似应该也可以筛出来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2012-1-31 23:49 | 显示全部楼层
本帖最后由 wcymiss 于 2012-1-31 23:51 编辑
xmyjk 发表于 2012-1-31 23:40
又测试了一下,最最最影响速度的还是cnn.Close那句,删了那句就差了非常非常多。

呵呵,之前赵老师有说 ...


所以说,我的代码偷机不少。我一个close也没有。{:soso_e127:}{:soso_e127:}{:soso_e127:}而且你们都是delete名字非“总”的工作表,而我只是clearcontents……

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-1 00:15 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-2-1 00:17 编辑
xmyjk 发表于 2012-1-31 23:40
又测试了一下,最最最影响速度的还是cnn.Close那句,删了那句就差了非常非常多。

呵呵,之前赵老师有说 ...


我不习惯每连接一个工作簿后就用cnn.close,这样速度太慢,而是用大家通常用的方式:
Set cnn = New ADODB.Connection
(或Set cnn = CreateObject("ADODB.Connection"))
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & MyPath & MyFile
最后再
    rs.Close
    cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
这与Set d = New Dictionary道理相同,经测试,Set cnn = New ADODB.Connection后打开新连接比cnn.close快很多:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-2-1 00:27 | 显示全部楼层
zhaogang1960 发表于 2012-2-1 00:15
我不习惯每连接一个工作簿后就用cnn.close,这样速度太慢,而是用大家通常用的方式:
Set cnn = New A ...

多谢赵老师讲解,原来还有这么多技巧,彻底长见识了。。。

TA的精华主题

TA的得分主题

发表于 2012-2-1 08:15 | 显示全部楼层
之前吴姐告诉我字典用 Set d = New Dictionary  速度会快一些。
原来cnn 也可以不关闭,直接 set cnn = New ADODB.Connection
多谢各位,见识了。

TA的精华主题

TA的得分主题

发表于 2012-2-1 09:44 | 显示全部楼层
zhaogang1960 发表于 2012-2-1 00:15
我不习惯每连接一个工作簿后就用cnn.close,这样速度太慢,而是用大家通常用的方式:
Set cnn = New A ...



晕死,不知道上面这句那里要被和谐了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2012-2-1 09:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xmyjk 于 2012-2-1 11:27 编辑
zm0115 发表于 2012-2-1 08:15
之前吴姐告诉我字典用 Set d = New Dictionary  速度会快一些。
原来cnn 也可以不关闭,直接 set cnn = Ne ...

是类那块的思想,太久没搞这东东,我都快忘光了。

Dim   cnn   As   new   ADODB.Connection,是声明了变量又实例化了,也就是系统分配了内存。

而分两步走:
Dim   cnn1   As   ADODB.Connection 先是定义了变量,不会分配内存,接着
set   cnn1=new   ADODB.Connection 才会开始实例化,也就是分配内存。。
如果原对象存在,重新set的时候会销毁内存,进行新的类实例化

虽然这两个是等价的,但是实际应用起来还是有差别的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-1 09:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jspta 发表于 2012-2-1 09:44
晕死,不知道上面这句那里要被和谐了。

看来你对“同时连接”的概念不清楚,通常我们循环连接很多工作簿,是用一个cnn连接的,不管你用什么手段,都不可能同时连接多个工作簿,而你使用的cnn(1)连接第一个,cnn(2)连接第二个……,程序结束时再一并断开所有的工作簿连接,这样解释不知道你理解了没有?

TA的精华主题

TA的得分主题

发表于 2012-2-1 10:06 | 显示全部楼层
xmyjk 发表于 2012-2-1 09:46
是类那块的思想,太久没搞这东东,我都快忘光了。

Dim   cnn   As   new   ADODB.Connection,是声明了 ...

炫月兄, 多谢解释,太深的理论兄弟我不会的呀,你了解我的,呵呵。
我就记得以后怎么用着快就行。哈~~~~~

点评

哈哈哈,一切理论都要应用化的,不然也白搭,哈哈,务实才是。腾腾兄才是转化实效的高手。  发表于 2012-2-1 10:57

TA的精华主题

TA的得分主题

发表于 2012-2-1 10:19 | 显示全部楼层
zhaogang1960 发表于 2012-2-1 09:58
看来你对“同时连接”的概念不清楚,通常我们循环连接很多工作簿,是用一个cnn连接的,不管你用什么手段, ...

不好意思老师,我没说清楚,我取消了数组的同时连接,而是通常的单个连接,即跟老师的方法是一样的。
请老师测试,代码在Sub GetSheetName 中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-6 19:50 , Processed in 0.045247 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表