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-30 22:28 | 显示全部楼层
本帖已被收录到知识树中,索引项:Application对象
你真的好犀利啊!!!我怎么个搜索页找不到这些知识呢!!!不知道你是怎么学习到的!!!!

你这样的人不去大学做教授实在是太可惜了!!

TA的精华主题

TA的得分主题

发表于 2012-3-30 22:34 | 显示全部楼层
本帖最后由 liucqa 于 2012-3-30 22:36 编辑
hiyou 发表于 2012-3-30 13:19
唔,这有一个问题,你想跨过另一个WORKBOOK访问对方的子程序?

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

在一个application里面可以用下面的语句来跨工作簿访问sub
Application.Run "'" & newWB.FullName & "'!sheet1.test"

在不同的application里面上述语句是不是也要先引用呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-30 23:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请教下

windows().activate

这句应该如何使用?我试了很多方法都不行哦~~!

另外运行的时候是后台运行的,没看到页面的跳转,如果希望看到页面跳转应该怎么写好呢? ^^

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-30 23:22 | 显示全部楼层
DEAR hiyou 再请教下您 ^^

xl1app.Workbooks("book1").Sheets("sheet1").Select
xl2app.Workbooks("book2").Sheets("sheet2").Select

xl1.windows("book1").activate

等,好像激活窗口到前台都不可以哦~~当然前台后台都是一样的 ^^

不过想不明白为什么激活不了~~不知道我对原理的哪里的理解错了~~

TA的精华主题

TA的得分主题

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

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

谢谢大侠分享,收藏学习中,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-3-31 10:35 | 显示全部楼层
hiyou 发表于 2012-3-30 13:19
唔,这有一个问题,你想跨过另一个WORKBOOK访问对方的子程序?

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

以下代码在两个进程的工作薄已经打开的情况下测试通过,
非常感谢hiyou同志非常耐心详尽和系统而全面的指导!!

但是又有一些小问题,出现在另一个工作薄没有打开的情况下。
当然可以使用另外的代码处理,但是我希望能更完美一些,
直接在你的代码处理,而不必调用API遍历进程判断目标工作薄
是否已经打开,再使用OPEN这么繁琐的(虽然已经写好的)代码。

因为简化代码可是非常珍贵的知识啊!!简洁的代码非常让人内心舒坦^^

附上代码:(按hiyou的指导写的,与调用API丛林密布般的代码形成鲜明对比!!)


Sub 进程间数据交换()
Call 复制数据
Set wrk2 = GetObject("D:\DATA表格\TTT.xlsm") '<---不明白为什么使用工作薄名称无法激活
                                                                            '难道我写错名字了吗?可是已经试了很多名字了哦~~
'Set xl1app = wrk1.Application'<---这个使用会出错 所以去掉了 我才明白原来是第三个进程才需要这个
Set xl2app = wrk2.Application
xl2app.Visible = ture      '<-----请教如果是未打开的话,不知道为什么这句还是不能visible,
                                    '而是以看不见的方式打开的 双击原文件会提示文件已经打开,
                                    '重新打开会丢失数据的那几句话,如恶化才能让它可视?

Call xl2app.Worksheets("明细").将剪贴板内容黏贴         '<------请教如果是未打开的话,
                                   '这句会出错,请问应该如何修改?因为他们是在同一个
                                   '进程了,但是工作薄之间的宏的调用方式不知道在这个
                                   '情况下应该怎么写?
End Sub

TA的精华主题

TA的得分主题

发表于 2012-3-31 20:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liucqa 发表于 2012-3-30 22:34
在一个application里面可以用下面的语句来跨工作簿访问sub
Application.Run "'" & newWB.FullName & "' ...

我在03做了一次测试,同一实例开两个新的WORKBOOK,BOOK1和BOOK2,没有存档的情况下
BOOK2模块允许这样调用
Application.Workbooks("book1").Worksheets("sheet1").test

不过,楼主的问题里,他明显是07以上的版本,我试着用07调用,有一个问题是,07似乎会限制新工作簿安全性,包括APPLIATION.RUN的测试也失败(已经存档的再OPEN就没问题)
___________________
至于EXCEL多实例的情况,它们不能认出另一个实例里的宏,但前面说过,只要成功得到两个WORKBOOK的实例对象,再引用它们的上一级APPLICATION对象,这两个APPLICATION可以分别调用各自的SUB.
set xlApp1=getobject("book1").application
set xlApp2=getobject("book2").application
xlapp1.run ....
xlapp2.run ....

其中会造成困惑的是窗口和界面,用户窗口,包括ACTIVE切换\MSGBOX和其它界面,多EXCEL实例是各自切换,即使调用SUB和FUNCTION,也各自为政.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-3-31 22:06 | 显示全部楼层
一般来说,“正常的”(MS推荐的操作)是WORKBOOKS.OPEN和WORKBOOKS.ADD
直接指定PATH用GETOBJECT得到XLS(XLSM),它是不可见的对象,你要用GETOBJECT的话,这么操作好了
注意后面两句
  1. strXlsName="D:\DATA表格\TTT.xlsm"
  2. set wrkX=getobject(strXlsName)
  3. wrkx.application.visible=true   '令APPLICATION可见
  4. wrkx.application.windows(wrkX.name).Visible=True  '令WORKBOOK可见
复制代码
上面要连做两个VISIBLE=TRUE,是因为GETOBJECT(“某个路径的XLS”)得到的是一个WORKBOOK对象,关联得到的APPLICAON和它本身的WINDOW都是VISIBLE都是FLASE,不管哪一个不可见,都不能显示出BOOK。

话说回来,以前实际的应用里,如果我要在其它非OFFICE非EXCEL的程序进程里打开EXCEL进程,首先是CREATEOBJECT(“EXCEL.APPLICATION")而不是GETOBJECT,这样得到的是一个APPLICATION对象,它的VISIBLE属性也是FALSE,但跟着就是WORKBOOKS.OPEN,它是跟着APPLICATION属性一起隐藏的,没那么复杂。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-4-1 19:58 | 显示全部楼层
本帖最后由 veggieg 于 2012-4-1 20:03 编辑
hiyou 发表于 2012-3-31 22:06
一般来说,“正常的”(MS推荐的操作)是WORKBOOKS.OPEN和WORKBOOKS.ADD
直接指定PATH用GETOBJECT得到XLS( ...


hiyou你的测试真是很细腻啊,还包含了不同的版本 ^^  居然还从中推理出我使用的不是03版本,科学和逻辑的威力啊 ^^

问题基本已经完全解决了,非常感谢您一直以来的教导和非常珍贵知识的分享!!
可是为了求个甚解,还想请教你一个问题 : )

我按你的指导写代码如下:

Sub 进程间数据交换()
Call 复制数据
str2lsName = "D:\DATA表格\TTT.xlsm"
Set wrk2 = GetObject(str2lsName)
wrk2.Application.Visible = True '令APPLICATION可见
wrk2.Application.Windows(wrk2.Name).Visible = True '令WORKBOOK可见
'Set xl1app = wrk1.Application
Set xl2app = wrk2.Application

xl2app.Range("D26") = "112411" & xl2app.Range("D26")   '<------这句在目标EXCEL(str2lsName = "D:\DATA表格\TTT.xlsm")没有打开而运用该段代码打开目标EXCEL第一次的时候运行没有任何问题 ^^   可是我尝试进行第二次运行的时候,不知道是什么原因导致这个"112411"写在了宏所在的工作簿里而不是目标EXCEL里

xl2app.Run "'TTT.xlsm'!sheet3.将剪贴板内容黏贴"               '<------这句在目标EXCEL(str2lsName = "D:\DATA表格\TTT.xlsm")没有打开而运用该段代码打开目标EXCEL第一次的时候运行没有任何问题 ^^   可是我尝试进行第二次运行的时候,不知道是什么原因无法运行了。我尝试了修改这个语句但是试了很多方法都不行呢 所以我写了上面这句测试用,发现应该是代码运行的对象指向向了错误的地方

End Sub

我尽量再描述一次,就是这段代码在目标EXCEL已经打开的情况下,保存该宏的EXCEL运行代码没有任何问题,非常感谢hiyou的代码!!:)
不过有个小问题我不能明白的是,就是在目标文件没有打开的情况下会这样:
1. 第一次运行没有任何问题
2. 如果在第一次成功运行后再想运行第二次却不可以,会报错

我看到在目标文件没有打开的情况下这段代码打开了的目标EXCEL和保存该宏的EXCEL是在一个EXCEL进程里的,希望再请教下您代码第二次不能运行到底原因呢。我想不到呢。看VBE窗口我认为他们是在同样的application里,不知道是不是Set xl2app = wrk2.Application又让他们不完全在同一个EXCEL进程里呢?根据你之前的指导,应该还是Application的问题吧,没有在代码交代清楚导致程序不知道代码的指向导致的吧,可是我只能想到这么远而已了~~

TA的精华主题

TA的得分主题

发表于 2012-7-30 18:49 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 07:28 , Processed in 0.047778 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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