ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-3-27 16:09 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:Application对象
本帖最后由 veggieg 于 2012-3-27 18:01 编辑

系统进程打开了2个EXCEL,请教两个EXCEL进程之间如何进行数据交换?
实验方法:
大家可以从【开始】里面打开EXCEL
从那里面打开几个EXCEL就有几个EXCEL进程
难题是这些EXCEL进程之间如何进行数据交换呢?
比如从【开始】打开3个EXCEL,但是它们之间无法遍历到其他的的EXCEL窗口。

EXCEL自身的VBA肯定无法解决这个问题的了,解决的方法大概只有2个?:
1. 设置EXCEL使之只能打开一个进程;
2. 调用API 本社区的API研究是在是非常厉害了,特来此宝地求助啊!

该问题在先前一贴还没解决,希望这次表述清楚了这个棘手的问题啊,希望高手指导啊!!小生不胜感谢!!

点评

知识树索引内容:27、28、32楼  发表于 2013-9-25 22:01

TA的精华主题

TA的得分主题

发表于 2012-3-27 18:26 | 显示全部楼层
我是这么想的,让一个application去访问另一个application的数据,这种行为貌似有点像病毒了

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-27 19:58 | 显示全部楼层
liucqa 发表于 2012-3-27 18:26
我是这么想的,让一个application去访问另一个application的数据,这种行为貌似有点像病毒了

DEAR liucqa ^^

请问代码应该怎么写啊~!:)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-27 23:18 | 显示全部楼层
1楼的方法可以打开多个EXCEL进程 但是它们之间如何进行数据交换呢

TA的精华主题

TA的得分主题

发表于 2012-3-28 10:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用剪切板不行吗?我的意思是用第三方文件来存储数据,在每一个excel进程中去访问这个数据文件。数据文件需要自己定义,数据位置、校验方法以及数值。
我刚接触vba,纯属瞎想的。只能提供一个思路了。帮顶!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-28 16:55 | 显示全部楼层
sdrcxzy 发表于 2012-3-28 10:12
用剪切板不行吗?我的意思是用第三方文件来存储数据,在每一个excel进程中去访问这个数据文件。数据文件需要 ...

谢谢帮顶!

这样当然OK的,就是不知道如何调用API实现两个EXCEL进程之间的数据交换~!

TA的精华主题

TA的得分主题

发表于 2012-3-29 10:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
进程之间的交换,古老的工作是DDE,但那是AUTOMATION之前的技术,而取得进程的ID则要FINDWINDOW,这是API的事。
有一个简单的做法,就是GETOBJECT会按实例顺序打开进程实例,参考MS的说法
http://support.microsoft.com/kb/288902/zh-cn

具体来说,不管你用什么手段开了EXCEL的多个实例——这里你用手工在程序行上开了两个EXCEL进程——那么在任务管理器上可以看到两个EXCEL,也就是包含有两个APPLICATION自动化对象。
然后,简单一点的假设,如果这两个EXCEL是“空的”,它里面就是BOOK1和BOOK2,如果有文件(假定你打开了某文件XLS)则取得具体的字串
SET XL01=GETOBJECT(BOOK1,"EXCEL.APPLICATION)
SET XL02=GETOBJECT(BOOK2,"EXCEL.APPLICATION)
以上就取得了两个不同APPLICATION的实例对象
你可以对XL01和XL02分别进行WORKBOOKS.add、或OPEN然后衍生其它对象测试,当然最实在的是在WORKSHEET的RANGE里写个VALUE测试

这里有个问题就是,如果不确认打开的是BOOK1和BOOK2怎么办(不知道BOOK1,BOOK2还是BOOK3?)
但我个人的看法,你要不是手工打开,用代码打开的话,那段代码在生成EXCEL实例的时候,就应该抓住对象实例句柄了,除非你是两段不同的程序代码,互相没有接口的......




评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-29 11:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
hiyou 发表于 2012-3-29 10:33
进程之间的交换,古老的工作是DDE,但那是AUTOMATION之前的技术,而取得进程的ID则要FINDWINDOW,这是API的 ...

太好了!!终于等到知道这个问题的高手出现了!!

hiyou您好,文件名是可以通过代码找到的(假设是BOOK2),Set XL1 = GetObject("BOOK2", Excel.Application)请问是下面这样写吗?

Sub AAAA()
Dim XL1 As Object
Set XL1 = GetObject("BOOK2", Excel.Application)
Range("A1").Value = "11"
End Sub

我这样写出错了,“ACTIVEX 不见不能创建对象”,希望您指点下详细代码,非常感谢!!

TA的精华主题

TA的得分主题

发表于 2012-3-29 11:50 | 显示全部楼层
for each w in workbooks不就可以访问了?!

TA的精华主题

TA的得分主题

发表于 2012-3-29 12:23 | 显示全部楼层
veggieg 发表于 2012-3-29 11:28
太好了!!终于等到知道这个问题的高手出现了!!

hiyou您好,文件名是可以通过代码找到的(假设是BOO ...

Set XL1 = GetObject("BOOK2", Excel.Application)
这一句有问题,黑体中,标准的写法是
GetObject("BOOK2","Excel.Application") '<= 类名要引起来

(不过我前面的示范也有问题,就是BOOK1和BOOK2没有加引号,结果会指向一个0变量)

再想了想,没有必要搞得这么复杂,改了一下
看下面的代码,你先打个两个实例,确认它们分别是BOOK1和BOOK2,如果是别的名字(BOOK3什么的)就改名

  1. '这里注意一下,不管在哪里的VBA代码,
  2. '都能抓到两个WORKBOOK的对象实例
  3. set wrk2=getobject("book2")
  4. set wrk1=getobject("book1")
  5. '然后从两个WORKBOOK上引申到两个APPLICATION上
  6. set xl1App=wrk1.Application
  7. set xl2App=wrk2.Application
  8. xl1app.range("a1")="hi,book1"
  9. xl2app.range("a1")="hello,book2"
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-24 05:16 , Processed in 0.036227 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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