ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 用VB6调用已经打开的EXCEL文档

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-4-23 20:07 | 显示全部楼层 |阅读模式
本帖最后由 yiyiyicz 于 2019-4-25 17:39 编辑

用vb6打开excel文件,然后做读写操作,很好办
但对已经打开的excel操作,我费了好大劲才搞定,原理不明白。和各位坛友分享

Dim Xlapp As Excel.Application
Dim Xlbook As Excel.Workbook
Dim Xlsheet As Excel.Worksheet
    On Error Resume Next
    Set Xlapp = GetObject(, "excel.application") '打开已有的对象,这里假定只有一个excel文件
    If Xlapp Is Nothing Then '如果打开不成功,即excel文件没有打开
        Set Xlapp = CreateObject("excel.application") '建立excel对象
        Set Xlbook = Xlapp.Workbooks.Open(App.Path & "\demo.xlsx") '打开指定的文件,路径,文件名
        Xlapp.Visible = True '显示模式,显示
    End If
    Set Xlsheet = Xlbook.Worksheets("基本数据") '指定具体的sheet
    If Val(Xlapp.Application.Version) >= 8 Then '//这段是从网上抄的,什么道理不明白
        Set Xlsheet = Xlapp.ActiveSheet '//这段是从网上抄的,什么道理不明白
    Else '//这段是从网上抄的,什么道理不明白
        Set Xlsheet = Xlapp '//这段是从网上抄的,什么道理不明白
    End If '//这段是从网上抄的,什么道理不明白
    Debug.Print Xlsheet.Cells(56, 2)
    MsgBox Xlsheet.Range("B56").Value

说明:
    On Error Resume Next
    Set Xlapp = GetObject(, "excel.application")
    If Xlapp Is Nothing Then
        Set Xlapp = CreateObject("excel.application")
        Set Xlbook = Xlapp.Workbooks.Open(App.Path & "\demo.xlsx")
        Xlapp.Visible = True
    End If
这段作用为:使用一个已经打开的对象,当对象还没有打开,则新打开。曾经看到有人说,只用“GetObject(, "excel.application") ”这一句就能实现前述功能,但我没有试出来。
这是标准操作,比较严谨。很多场合都是用这个套路。
特别要理解  GetObject(, "excel.application") 。注意格式

说明:
    If Val(Xlapp.Application.Version) >= 8 Then
        Set Xlsheet = Xlapp.ActiveSheet
    Else
        Set Xlsheet = Xlapp
    End If
这段是从网上抄的,什么道理不明白。但确实可以不用再次打开已经打开的excel文件,而能正常操作这个已经打开的excel文件
如果新打开excel文件,这段程序也能正常运行。
if endif结构显得啰嗦,对于版本高的Excel,只需要一句标红的语句
哪位牛人给注释,或者解释其中道理。我的理解是对象设置与激活的问题
【补充】标红的是关键。没有这句,操作已经打开的excel文件,无效,诡异的是没有出错提示。同样的代码,新打开excel文件并操作,成功。
我试过激活工作簿、工作表;试过激活窗体;试过excel最大化最小化都没用。
可再次设置对象变量,程序就走通了。费解



TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-23 20:20 | 显示全部楼层
VB6使用Excel,还有一种比较好的方法---DDE
试过,挺不错
网上可以找到现成的代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-23 20:29 | 显示全部楼层
我用的是excel2007,“Set Xlsheet = Xlapp.ActiveSheet ”是关键
之前试的时候,各种active,activesheet都用过,没效果。
这句是set语句,为对象变量(指针)设置

TA的精华主题

TA的得分主题

发表于 2019-4-23 21:30 | 显示全部楼层
If Val(Xlapp.Application.Version) >= 8 Then
这个判断电子表格的版本,早期版本表格的列最多255,行最多65535

Set Xlsheet = Xlapp.ActiveSheet
这个是当前活动表,就是你正在用的表

Set Xlsheet = Xlapp
这个就是 将Xlsheet设置为应用实例对象,不知道为什么这么用

电子表格从属可以这样分
Application '应用实例

      Workbooks 工作簿对象集合,比如,打开了a.xls,b.xls........都包含这里面

          Worksheets 工作表对象集合,比如:a.xls中有3个工作表,都包含这里面
一般定位一个工作表就是一层一层来
获得实例——》获得工作簿——》获得工作表,有了工作表对象,就可以对单元格任意操作了。

  如果你将Set Xlapp = GetObject(, "excel.application") 中的 "excel.application"改为"et.application"就可以对WPS表格操作,所有的属性、方法都是通用的。

这个详细的知识可以看电子表哥编程参考手册,很详细的,而且都有例子。

TA的精华主题

TA的得分主题

发表于 2019-4-23 21:41 | 显示全部楼层
VB6 好多年没玩了。。。。

TA的精华主题

TA的得分主题

发表于 2019-4-23 21:42 | 显示全部楼层
在理想情况下,比如你手动打开了一个表格,名字叫:“demo.xlsx”

你想对这个文件的活动表的A1写入“test”,写入以下语句即可:

Set Xlapp = GetObject(, "excel.application")
Set Xlbook = Xlapp.Workbooks("demo.xlsx")
'Set Xlbook  = Xlapp.ActiveWorkbook'如果只有一个文件,也可以用这句
Set Xlsheet = Xlbook.Worksheets(1)'获得第一个工作表对象,也可换成工作表的名字:如“sheet1”
'Set Xlsheet = Xlbook.ActiveSheet'如果想对当前活动表处理,就可以用这个
Xlsheet.range("A1")="test"   '这个就可以在A1单元格写入了

debug.print Xlbook.name,Xlsheet.name

往往实际运用中不是理想情况,所以加了很多意外情况的处理代码。

TA的精华主题

TA的得分主题

发表于 2019-4-23 23:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jiminyanyan 发表于 2019-4-23 21:41
VB6 好多年没玩了。。。。

😀我目前还在用这个,反正自己只是个爱好者,只当是玩游戏了。

TA的精华主题

TA的得分主题

发表于 2019-4-24 10:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-30 19:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-30 19:53 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-13 15:13 , Processed in 0.041418 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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