ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 【高难度】系统进程打开了2个EXCEL,请教两个EXCEL进程之间如何进行数据交换?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-3-29 12:37 | 显示全部楼层
本帖已被收录到知识树中,索引项:Application对象
上面的代码我再说明一下
GETOBJECT有几个用法,不同的自动化模型里稍有差别,只说EXCEL的
SET 对象=GETOBJECT("对象名")  '《-这里就是硬生生不管进程位置,只要存在对象把它们抓出来了

SET 对象=GETOBJECT("对象名",“类库名”),就是上面你理解得有点X,我说得也有点X的东东
一般来说,它是这样的
SET 对象变量=GETOBJECT("c:\某文件路径\某XLS文件.xls",“excel.application”)  '<==这样就得到一个具体的XLS APPLICATION,并打开了指定的文件(WORKBOOK)
SET 对象变量=getobject("C:\某文件路径\某类型文件.后缀","OOOO.XXXX")  '<==其中OOOO.XXXX是自动化类型,象WORD.APPLICATION啦,AUTOCAD.APPLICATION啦,你就能得到一个对应的WORD\AUTOCAD对象

还有一种就是不加文件名的
SET 对象变量=getobject(,"OOOO.XXXX")  ‘<==那个逗号前面留空,于是它在进程里找,有没有第一个OOOO.XXXX的第一个实例
比如说,我们在扯的这个EXCEL.APPLICATION,它就会找第一个实例

——————————————————————
不过很麻烦的就是,最后那种用法,不能用于找多个实例,而第二种加文件名的用法,你得打开了路径(URL\文件名)生成了一个文件对象而不是一个APPLICATION进程。
象这种本身没有打开文件,只有默认的BOOK1\BOOK2\BOOK3...BOOKN的情况,我想了想,还是用第1种,直接找自已的对象方便。前面说过,如果你是用自已代码在系统进程里生成了多个EXCEL实例,一般代码就应该有类似SET XL1=实例这种方法抓住各个实例对象的句柄以便交换数据才对。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-29 22:40 | 显示全部楼层
hiyou 发表于 2012-3-29 12:37
上面的代码我再说明一下
GETOBJECT有几个用法,不同的自动化模型里稍有差别,只说EXCEL的
SET 对象=GETOB ...

高手啊!!!!非常感谢!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-29 23:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hiyou 发表于 2012-3-29 12:23
Set XL1 = GetObject("BOOK2", Excel.Application)
这一句有问题,黑体中,标准的写法是
GetObject("BO ...

hiyou真是神人啊!!!

好犀利啊!!!版主应该给你的回帖加精华的!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-29 23:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Zamyi 发表于 2012-3-29 11:50
for each w in workbooks不就可以访问了?!

zamyi您好,这个在单个进程里可以,多个就不可以啦~~

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-30 09:05 | 显示全部楼层
hiyou 发表于 2012-3-29 12:23
Set XL1 = GetObject("BOOK2", Excel.Application)
这一句有问题,黑体中,标准的写法是
GetObject("BO ...

Dear hiyou  ^^

不好意思再请教下您  如何在两个表里CALL SUB?




TA的精华主题

TA的得分主题

发表于 2012-3-30 09:52 | 显示全部楼层
veggieg 发表于 2012-3-30 09:05
Dear hiyou  ^^

不好意思再请教下您  如何在两个表里CALL SUB?

不太明白这句话的意思。
标准模块里的SUB和FUNTION,默认是公用的PUBLIC,直接可以CALL。

同一个WORKBOOK里的WORKSHEET,因为它们是类模块——事实上,所有的WORKBOOK(工作簿)、WORKSHEET(工作表以及其它类型的SHEET,图表)都是类模块的一种(它们有类模块,和一般类不同的是,有同名的实例对象)——所以在工作表里的SUB、FUNCTION默认是“类模块的声明”

所以,你要在什么地方调用这些东西,当成一个“对象的方法”调用就没错了。因为这是“某个工作表(对象)的方法”,而不要当成某个工作表(模块)里的过程,比如SHEET1.TEST1,SHEET2.TEST1这样。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-30 11:31 | 显示全部楼层
hiyou 发表于 2012-3-30 09:52
不太明白这句话的意思。
标准模块里的SUB和FUNTION,默认是公用的PUBLIC,直接可以CALL。


哇!非常感谢您这么深刻的回答!!

主要是我的2个表格里比如分别有 Sub AAA和Sub BBB,我不知道如何Call AAA和Call BBB哦~~

尝试 xl2app.Call BBB或者Call xl2app.BBB都不行哦~~

希望您能指导下这个问题,谢谢啦!

另外请问原则上所有的单元格引用为了避免混乱都应该加上对象xl2app或者xl1app是吗?

TA的精华主题

TA的得分主题

发表于 2012-3-30 11:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先留个脚印     

TA的精华主题

TA的得分主题

发表于 2012-3-30 13:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
唔,这有一个问题,你想跨过另一个WORKBOOK访问对方的子程序?

在同一个工作簿里的SUB和FUNCTION,你可以CALL,问题不算大。但是,在不同工作簿中,它们已经分属不同的类型库了,技术上,你在不同的工作簿里VBA代码上交叉引用另一个WORKBOOK的对象,会有复杂的问题(虽然不是不可能)。
OFFICE-EXCEL的模型结构中,它是这样的:
顶层有一个APPLICATION,其实是EXCEL.APPLICAION实例对象,你在主楼提到的,它一般有且只有一个实例(你费尽心思,或意外生成两个以上进程实例,它们还是会尽量合作)
APPLICATION下面,每个WORKBOOK对象可以看成独立的单元,它们在APPLICATION下有个WORKBOOKS集合(这也是独立的),但是!注意一下,WORKBOOK还伴有一个VBPROJECT(以及VBPROJECT集合),这些东东(对象)都有实例,不但有实例,也有类定义,最令初学者模糊的就是这些东西,比如说
你生成了BOOK1和BOOK2,可以这么理解:
1。BOOK1和BOOK2是在APPLICATION实例对象下的两个WORKBOOK(工作簿)“类”的实例对象
2。它们各自还有不同的类模板,就是BOOK1的类模板BOOK2的类模板,但是!(注意)你看不到这个类模板!!它们是和各自的WORKBOOK同名的
3。然后,每个SHEET(工作表)都是实例对象,也和上面的WORKBOOK一样,有自已的类模板,而且(注意!),有个同名的类模板!
   比如说,在BOOK1的SHEET1,你在SHEET1里写了一个SUB TEST,在BOOK2的SHEET2,你没做任何改变,
   黑字部分,BOOK1的SHEET1自动生成了一个"BOOK1的SHEET1类",它和BOOK1的其它SHEET2、SHEET3,以及BOOK2的SHEET1是完全不同的,特别是,这个类模板里,有一个SUB TEST

最后最后,技术问题就来了。比如你在其它的WORKBOOK里想要调用BOOK1的SHEET1的TEST....
DIM WRK001 AS WORKSHEET '<==定义一个WORKSHEET对象
SET WRK001=GETOBJECT("BOOK1").WORKSHEETS("SHEET1")  '<==取得BOOK1 sheet1对象
wrk001.test  ‘ xxxx出错!!

上面最后一句,在BOOK1里运行没问题,在其它WORKBOOK一般就ERROR,为什么?因为WORKSHEETS是根据“基本的WWORKSHEET工作表类生成的对象”
根据而不是BOOK1那个“修改后带有TEST的不同的工作表”,代码里根本不认识这个“奇怪的TEST方法或属性”
哪要怎么解决?
每个WORKBOOK的VBPROJECT都是一个类型库,你预先把它引用到VBA的工程中去(引用)就OK了,但这一步必须手工完成。
引用方法,是把需要被引用的XLS(或XLA)保存,另一个在VBA工具-引用-浏览,指出这个文档即可。
另外还有个问题,就是WORKBOOK对应的VBPROJECT默认都叫VBPROJECT,这名字都不对头,一旦引用,全都是VBPROJECT了,同名的VBPROJECT产生冲突
所以被引用的哪个应该把VBAPROJECT工程属性里把名字改掉,比如改成XX,XLA1,PRJ1什么的
引用成功后,代码里就这么调用
(假设你引用的工作簿有SHEET1,里面有个TEST SUB,VBAPROJECT属性名字叫XLA1)

CALL XLA1.SHEET1.TEST  '<==在XLA这个类型库里,已经有SHEET1类和TEST这个定义了




评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-30 22:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
hiyou 发表于 2012-3-30 13:19
唔,这有一个问题,你想跨过另一个WORKBOOK访问对方的子程序?

在同一个工作簿里的SUB和FUNCTION,你可以 ...

!!!!!!!!!!!!神作啊!!!!!!!!!!!!

如此详细,如此概念清晰条理分明!!!!!!!!!!!!

能从概念和集合角度解释的这么细腻,实在太强大啦!!!!

非常非常感谢你的教导啊!!!!!!!!!!!!!!!!


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

本版积分规则

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

GMT+8, 2024-11-24 07:54 , Processed in 0.041337 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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