ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] excel通过ado操作工作表的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-5-19 15:59 | 显示全部楼层 |阅读模式
本来想实现把自动筛选的结果根据某列的不重复值复制到单独的工作表中,在网上找了很久发现excel并没有一个筛选结果集的返回值。一条条处理太慢,只有通过sql实现。结果程序写完了,发现运行时生成几个工作表就出错了,错误提示:"用于查看已链接的 microsoft excel 工作表的连接,已经失去"。google了一个办法

http://www.officefans.net/cdb/re ... amp;goto=nextoldset

如何解决ADO链接工作簿用SQL操作工作表数据时,连接失去问题
本人通过ADO链接工作簿,以SQL方式操作工作表时出现"用于查看已链接的Microsoft Excel工作表的连接,已经失去"出话框,然后出现"系统资源不足"提示对话框.
    上述问题如何解决?
已自行解决
通过ADO使用SQL操纵EXCEL工作表时,注意通过CLEAR或CLEARCONTENTS后留下空白记录,应使用DELETE


出现的问题是一样的,但作者要处理的问题似乎和我的情况不太一样。后来发现如果用这个程序去处理一个还没打开的xls文件(实际用过同一个文件的复制品,改了个名而已),运行就很正常。

我用的是office xp sp3,工作表中没有空的单元格中。数据量很大,有6万多条,先不上传附件了,哪位有办法解决这个问题?

TA的精华主题

TA的得分主题

发表于 2010-5-19 16:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本来想实现把自动筛选的结果根据某列的不重复值复制到单独的工作表中,在网上找了很久发现excel并没有一个筛选结果集的返回值。

第一句就听不懂了

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-20 10:09 | 显示全部楼层

第一句就听不懂了?

不会吧,这个问题很普遍的,就是把自动筛选的有效行(可见的)复制到新的工作表中,根据某列的各个值,要不自己一个个分累死了。网上有个excel数据助手可以实现,就是注册要50元,还只能用一台机器。不常用,自己写一个算了,没想到碰到这么多问题,刚把imex的问题解决了,如下:

为什么读取到了excel数据记录,但取出的数据为空?

在用OLE DB,ISAM会尝试读取前8行的数据类型,如果一列中的前8行既有文本类型又有数字类型,那么就取多数的数据类型,其余的返回为空。如果两者一样的数目一样多,那么就取数字类型,文本类型的行返回空值。

举例说明:某一列前8行中

如果5行文本类型,3行数字类型  则返回结果为5行文本类型的数据,3行空值
如果5行数字类型,3行文本类型  则返回结果为5行数字类型的数据,3行空值
如果4行文本类型,4行数字类型 则返回结果为4行数字类型的数据,4行空值

当然8行以后的值按照前面探测的结果,如果跟结果一样的类型返回原来的值,如果相反则返回空值。

      
如果想在混合类型中返回真实的值,那么就要在连接字符串的扩展属性中加上IMEX=1;这个属性的对应值如下:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)

微软提醒说,谨慎使用IMEX=1,因为这是导入模式,在这种模式下做数据的添加或者更新结果不可预料,所以在对Excel做Insert 或者Update动作时,不要给这个属性赋值。

那么为什么在ImPort Mode的情况下就是用文本方式读取的那?
请看注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel 下面有个键ImportMixedTypes,它的值是Text,也就是说在导入模式下,混合数据类型统一处理为文本。

这样看似一切OK了,不过当你的数据前八行都是数字,后面的N(N>>8)为文本类型时,即使你把IMEX设为1,后面的文本还是不会显示的。

为什么?因为ISAM会一直在检索前八行数据,即使你跟他交待了在导入模式下使用文本类型,它还是比较关注前八行的情况,如果前八行都为数字,他还是要按数字来处理,

那么如果非得全部取出数据该怎么办呢?

还是得靠注册表,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel,下面有个键TypeGuessRows,其默认键值为8,这就是前八行的来源,你可以把它设为1-16行,当然也可以把它设为0,设置为0时,那么ISAM将不再看前几行,而是遍历所有行(实际自己测试过只有16384行(不算标题行),可以设置成65536,不需要重启即可生效)。如果所有行都是数字,那就是数字了,有一个不是数字那就按文本处理。


补充:做Excel导入数据库的时候,如果某列的格式不统一,就会出现读取为空的情况,就像上面说的那样,但是设置单元格为统一格式后(比如数字->文本格式),如果不双击单元格的话此单元格的格式是不会改变的,如果你乐此不疲的一个一个双击单元格也可以,不过网友提供了更好的办法:选中某列->数据->分列->下一步->下一步->选择文本->OK,立马就可以看到效果。

[ 本帖最后由 qqdtst 于 2010-5-20 10:14 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-5-20 12:14 | 显示全部楼层

原来是ms的问题

http://club.excelhome.net/viewth ... p;extra=&page=1
recordset超多次重复OPEN占用内存的问题
set  recordset=nothing并不能真正释放内存,没办法,曲线救国吧。

只是在用ado连接自身时出这问题,试过把连接置空也没用的。

可以操作同一文件的复本,但是那个复本不能打开,否则内存耗得更快。不知道为什么有人说打不打开都可以。可能我的数据量太大了,查询一共才30次而已。

而且发现一个问题,即便操作一个不打开的复本,内存仍然在缓慢增长,实际上如果查询太多次仍然会导致内存溢出,这是microsoft的问题吧。数据量过多还是用数据库吧。

[ 本帖最后由 qqdtst 于 2010-5-21 11:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2013-1-14 21:59 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-10-15 12:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-10-15 12:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
搞得这么复杂?
数据库连接无非就几种情况
1、连接不到服务器
2、连接超时或者丢失
3、没有指定的库
4、没有指定的表
5、没有指定的字段或者字段格式有误
6、函数有误
7、语句有误
8、获得空数据或者不存在数据(两者不一样啊)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 15:23 , Processed in 0.032552 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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