ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] ADO方式读取EXCEL数据存在致命BUG!!!!!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-9-11 19:29 | 显示全部楼层 |阅读模式
在进行VBA编程时,为了使程序适用范围广,执行效率高,大家都喜欢使用ADO方式来读取excel文档,该方式有如下优点:
   1、即使是当前机器上没有安装excel,也能通过ado方式读取excel文档中的数据;

   2、不用打开excel,直接调用数据,执行效率高。


把下面这段代码拷贝到VBA窗口,执行后会依次显示每个工作表表的名称:

Sub x()

  Dim ExcelDB As New ADODB.Connection
  Dim RS As ADODB.Recordset
  Dim S As String

  Set ExcelDB = New ADODB.Connection
  Set RS = New Recordset
  If Application.Version < 12 Then ExcelDB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;  Data Source=" &  ActiveWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=No'"
  If Application.Version >= 12 Then ExcelDB.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=NO';"

  Set RS = ExcelDB.OpenSchema(adSchemaTables)

  Do While Not RS.EOF
     S = RS("Table_Name")
     If Left(S, 1) = "'" Then S = Mid(S, 2, Len(S) - 3) Else S = Mid(S, 1, Len(S) - 1)
     MsgBox S
     RS.MoveNext
  Loop
End Sub


当我们高高兴兴地认为找到这么一种完美的方式读取excel数据时,我们却不知道微软已经暗中埋下夺命地雷:

如果工作表的名称中含有符号“.”则会变成“#”!!!!
比如工作表名称为:TEK-V1.0LT #7-30
通过这种ADO方式获取的名称却变为:TEK-V1#0LT #7-30


因此,在此郑重提醒各位,ADO读取excel数据方式有风险,使用需谨慎!


Excel必备工具箱(完全免费),欢迎下载!!…

TA的精华主题

TA的得分主题

发表于 2010-9-13 12:30 | 显示全部楼层

〖Excel Home友情提示〗

   

很遗憾通知楼上朋友,您的帖子在24小时之内没有任何回复!

通常情况下,本论坛发布的主题帖会在8小时被回复或处理。您的帖子在24小时之内未被回复,其中的原因可能是

1、问题表述不清、模棱两可,难以理解,帮助者被搞晕了,夺帖而出;
2、没有上传必要的附件,或附件被遗忘在某个角落;
3、发帖提问时,语气带棱角、带挑衅,不幸被列入不受欢迎的帖子;
4、所提问题不成立,或提不合理的要求,乐于助人者使出“走为上”之计;
5、话题较偏、较冷或者发布到了不合适的版块,暂时无人问津,顾影自怜。


为了提高您的问题解决效率,我们推荐您阅读以下文章:
* 如何发表新话题和上传附件:http://club.excelhome.net/thread-45649-1-1.html
* 发帖的技巧:http://club.excelhome.net/thread-176339-1-1.html
* EH技术论坛的最佳学习方法:http://club.excelhome.net/thread-117862-1-1.html

TA的精华主题

TA的得分主题

发表于 2010-9-13 12:58 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-9-13 15:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-9-13 16:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
感谢分享。

TA的精华主题

TA的得分主题

发表于 2010-9-13 19:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大哥,你发现完全错了,oledb有高级设置的,有个参数你还没写呢,如果遇到混合数据,一律按照文本处理,他自动帮你的数据改掉了,具体你参考msdn吧,没事别乱说,吓唬人

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-9-14 00:57 | 显示全部楼层
原帖由 a371014988 于 2010-9-13 19:27 发表
大哥,你发现完全错了,oledb有高级设置的,有个参数你还没写呢,如果遇到混合数据,一律按照文本处理,他自动帮你的数据改掉了,具体你参考msdn吧,没事别乱说,吓唬人

   或许我说的有点已偏盖全,还请你明确指出具体有什么改进办法,也不要想当然地就说我吓唬人,我想你说的“有个参数你还没写呢,如果遇到混合数据,一律按照文本处理”,那个参数是IMEX吧,无论IMEX=0 还是IMEX=1都不行。

   即时修改注册表后也不行,注册表修改内容如下:
在HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Excel有一个TypeGuessRows值,预设是8,表示会先读取前8列来决定每一个栏位的型态,所以如果前8列的资料都是数字,到了第9列以后出现的文字资料都会变成null,所以如果要解决这个问题,只要把TypeGuessRows机码值改成0。

因此,如果我确实错了,请明确指出,不但让我学到新知识,也让广大网友有所借鉴;如果你没有经过测试,仅仅凭感觉,那么也请别随便扣帽子,谢谢。

    此外,也请广大网友提供好的办法来解决这一问题。



[ 本帖最后由 ahzll 于 2010-9-14 01:00 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-6-17 13:34 , Processed in 0.042011 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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