ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

调用 DLL 文档前期绑定问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-4-12 11:42 | 显示全部楼层 |阅读模式
本帖最后由 何洋 于 2022-4-12 11:49 编辑

   使用VBA 调用VB6.0生成的DLL文档操作Excel,对 Excel 插件进行前期与后期绑定分别测试(引用的文档:Microsoft Excel 15.0 Object Library),前期绑定总是报错,后期绑定没问题,有哪位老师知道原因(测试文件如附件,只支持32bit Office)

VB6.0中的封装代码
image.png

前期绑定(勾选如蓝色背景)
112401vscv4f93aa5fazqf.png

前期绑定的的报错
image.png


后期绑定(去掉前期绑定的勾选)运行成功
image.png image.png




附件.zip

48.29 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2022-4-12 15:10 | 显示全部楼层
Dim xlapp As New Excel.Application '新建一个应用Excel程序,相当于再次从开始菜单中打开一个Excel。
Dim wb As Excel.Workbook
xlapp.Visible = True '让xlapp可见

此时,同时存在两个打开的Excel应用程序,一个打开有工作簿“测试.xlsm",一个是空的Excel,没有工作簿。

在xlapp中引用wbname将发生错误9(下标越界):
Set wb = xlapp.Workbooks(wbName)
因为xlapp中不存在任何工作簿。

存在wbname工作簿的是另一个应用程序。

xlapp中可以用open打开指定工作簿:
Set wb = xlapp.Workbooks.Open(wbName)
前提是,wbname要包含路径。

后期绑定的程序中不同,Set xlapp = GetObject(, "Excel.Application")直接把当前打开的Excel应用程序赋值给xlapp,自然,xlapp可以引用指定的工作簿wbname。

TA的精华主题

TA的得分主题

发表于 2022-4-12 15:14 | 显示全部楼层
前期绑定也可以使用GetObject()引用当前打开的应用程序:
Dim xlapp As Excel.Application
Dim wb As Excel.Workbook
Set xlapp = GetObject(, "Excel.Application")
Set wb = xlapp.Workbooks(wbName)

MsgBox wb.Name
MsgBox wb.Worksheets("OPT_Cover").Range("A1")

TA的精华主题

TA的得分主题

发表于 2022-4-12 15:35 | 显示全部楼层
直接传递Workbook对象:

VB6:
Sub 操作(wb As Excel.Workbook)
    MsgBox wb.Name
    MsgBox wb.Worksheets("OPT_Cover").Range("A1")
End Sub


VBA:
  1. Sub test()
  2.     Dim tt As New 测试操作.VB操作Excel
  3.     tt.操作 ThisWorkbook '写法一
  4.     Call tt.操作(ThisWorkbook) '写法二
  5.     Set tt = Nothing
  6. End Sub
复制代码



TA的精华主题

TA的得分主题

 楼主| 发表于 2022-4-12 19:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
山菊花 发表于 2022-4-12 15:10
Dim xlapp As New Excel.Application '新建一个应用Excel程序,相当于再次从开始菜单中打开一个Excel。
Di ...

老师,对于这句话中:
  “后期绑定的程序中不同,Set xlapp = GetObject(, "Excel.Application")直接把当前打开的Excel应用程序赋值给xlapp,自然,xlapp可以引用指定的工作簿wbname。“

”当前打开的Excel应用程序“是不是说,哪个工作簿的VBA调用了dll文档,它所对应的Excel应用程序就赋值给xlapp。

    还有一个问题:当Windows桌面没有Excel工作簿打开时,我打开一个工作簿,此时这个动作可以看作是先新打开一个Excel应用程序,这个程序中包含我所打开的工作簿,是这样吗?接着,如果我再打开一个工作簿,这个工作簿是与之前打开的共用一个Excel应用程序,还是自己重新再打开一个

TA的精华主题

TA的得分主题

发表于 2022-4-13 08:02 | 显示全部楼层
何洋 发表于 2022-4-12 19:56
老师,对于这句话中:
  “后期绑定的程序中不同,Set xlapp = GetObject(, "Excel.Application")直接把 ...

1、哪个工作簿的VBA调用了dll文档,它所对应的Excel应用程序就赋值给xlapp。
答:不能肯定说是或不是,如果当前桌面仅有一个打开的Excel,就是。如果打开有不止一个Excel,就不一定是。另外,也与赋值给xlapp的方式有关。

2、还有一个问题:当Windows桌面没有Excel工作簿打开时,我打开一个工作簿,此时这个动作可以看作是先新打开一个Excel应用程序,这个程序中包含我所打开的工作簿,是这样吗?

答:是

3、接着,如果我再打开一个工作簿,这个工作簿是与之前打开的共用一个Excel应用程序,还是自己重新再打开一个

答:一般情况下(通过Excel菜单命令、快捷键等方式打开,还有双击文件夹中的文件名),都是“与之前打开的共用一个Excel应用程序”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-4-13 18:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 何洋 于 2022-4-13 18:54 编辑
山菊花 发表于 2022-4-13 08:02
1、哪个工作簿的VBA调用了dll文档,它所对应的Excel应用程序就赋值给xlapp。
答:不能肯定说是或不是, ...

老师,还有几个问题是我一直困惑的:
1.VBA有什么方法可以知道我打开了几个 Excel 应用程序?每个程序包含哪些工作簿;
2.如果打开 Excel 程序很多,很难确定使用的是哪个,这样就很容易报错;怎么通过指定的 Excel 程序操作工作簿;比如,我现在新建了2个Excel 应用程序,假设它们对应的 ID 分别为xlapp_A, xlapp_B, 那我指定 ID 为 xlapp_A 的去打开并操作工作簿1,2,3, ID 为 xlapp_B 的去打开并操作工作簿4,5,6;当我想关闭工作簿4,5,6时,怎么去指定关闭它而不影响其它打开的 Excel 程序,之前我直接使用的 Quit 方法,发现打开的 Excel 全部会关闭

TA的精华主题

TA的得分主题

发表于 2022-4-14 07:45 | 显示全部楼层
我也不知道。
个人浅见,这些想法绕远了,什么程序能这么复杂?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-5 17:22 | 显示全部楼层
本帖最后由 何洋 于 2024-6-6 08:56 编辑
山菊花 发表于 2022-4-12 15:35
直接传递Workbook对象:

VB6:

老师,我试了这个方法,会报错(VB6.0已经勾选对Excel中引用):


image.png


问题1: 为什么不能直接将 ThisWorkbook 当作参数传递?

VB6.0中的代码


image.png

VBA中的代码:

image.png

运行报错:


image.png



改成下面的格式才能运行正确:

VB6.0中的代码
image.png


VBA中的代码:
wb 只能定义为 Variant类型(即 Dim wb As Variant)才能运行成功,以下定义均会报错

  Dim wb As Workbook (运行报错)
  Dim wb As Object (运行报错)
image.png

运行成功:


image.png image.png image.png


问题2: 使用前期绑定DLL文档,为什么不需要添加完整的路径
比如将 : Set s = CreateObject("DLL测试.TestFunction")
   写为:  Set s = CreateObject(DLL的路径 + "DLL测试.TestFunction")


image.png
image.png
image.png
image.png

调用VB测试.rar

16.58 KB, 下载次数: 5

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

本版积分规则

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

GMT+8, 2024-11-17 07:50 , Processed in 0.036185 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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