程序员开发实例大全宝库

网站首页 > 编程文章 正文

Excel VBA 前期绑定与后期绑定/答粉丝问

zazugpt 2025-02-15 18:14:07 编程文章 28 ℃ 0 评论

本文于2023年7月29日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

内容提要

  • 前期绑定与后期绑定

大家好,我是冷水泡茶,昨天有位粉丝朋友在我企业微信咨询代码出错的问题:

今他把原文件发给我,我在我的电脑上运行了一下,没有发现问题:

什么情况?

原来是这个意思!您老人家早说嘛!

我把代码复制到一个新的工作表,果然报错:

很明显,是一个引用Acrobat库的问题。当前采用的方法叫“前期绑定”,需要在引用中勾选Adobe Acrobat x.0 Type Library,由于是将代码复制到新的工作簿,没有勾选这个库,所以出现“用户定义类型未定义”错误。于是,我就这样回复了他:

那么,我们就来勾选一下吧,但我没找到Adobe Acrobat x.0 Type Library,于是就勾选了Acrobat,然后再打开引用,它就变成了Adobe Acrobat 10.0 Type Library

再运行代码,就OK了。

那么,手工勾选引用库是不是不太方便?还有一种方法,叫“后期绑定”,只要我们的电脑里安装了这个库,不管勾选与否都可以正常运行,这里需要调整一下代码:

原代码:

Dim sPDdoc As New Acrobat.AcroPDDoc, tPDdoc As New Acrobat.AcroPDDoc

修改为:

Dim sPDdoc As Object, tPDdoc As Object
Set sPDdoc = CreateObject("AcroExch.PDDoc")
Set tPDdoc = CreateObject("AcroExch.PDDoc")

问题解决,下面我们再来详细讨论一下前期绑定后期绑定的问题:

何为前期绑定

前期绑定是指在定义对象变量的时候,指定特定对象类型,就是前期绑定对象,将外部库的引用信息固定下来。在前期绑定下,可以使用代码提示和自动完成功能。

为了使用前期绑定,我们需要在VBA编辑器的"工具"->"引用"菜单中选择需要使用的外部库(例如,Microsoft Excel对象库、Microsoft Word对象库等)。

在选择了引用后,我们就可以使用该库的对象和成员,并且可以通过对象浏览器查看该库的层次结构和成员信息。

常用前期绑定对象定义语句,我们列几个:

' Microsoft Scripting Runtime 对象库(用于字典)
' 显示名称:Microsoft Scripting Runtime
' 实际库名称:scrrun.dll
Dim dic As New Scripting.Dictionary


' Microsoft VBScript 正则表达式 5.5 对象库(用于正则表达式)
' 显示名称:Microsoft VBScript 正则表达式 5.5
' 实际库名称:vbscript.dll
Dim reExp As New RegExp


' Microsoft Scripting Runtime 文件系统对象库(用于文件系统)
' 显示名称:Microsoft Scripting Runtime
' 实际库名称:scrrun.dll
Dim FSO As New Scripting.FileSystemObject


' Microsoft Word 对象库(用于Word对象)
' 显示名称:Microsoft Word xx.x 对象库 (如:Microsoft Word 16.0 对象库)
' 实际库名称:MSWORD.OLB
Dim wordApp As New Word.Application


' Adobe Acrobat 对象库(用于Acrobat对象)
' 显示名称:Adobe Acrobat xx.x Type Library (如:Adobe Acrobat 11.0 Type Library)
' 实际库名称:Acrobat.dll (版本可能不同,例如 AcroPDF.dll)
Dim AcrobatDoc As New AcroExch.AcroApp
Dim AcrobatDoc As New AcroExch.PDDoc


' Microsoft ADO 数据库对象库(用于Access数据库连接对象)
' 显示名称:Microsoft ActiveX Data Objects x.x Library (如:Microsoft ActiveX Data Objects 6.1 Library)
' 实际库名称:msado15.dll
Dim cnADO As New ADODB.Connection


' Microsoft XML v6.0 对象库(用于处理和操作XML数据)
' 显示名称:Microsoft XML v6.0
' 实际库名称:msxml6.dll
Dim?xmlDoc?As?New?MSXML2.DOMDocument60

优点:

提供了更好的代码提示和自动完成功能,编写代码更加方便快捷。

在运行时,由于编译器已经知道对象的类型,因此通常比后期绑定更快。

缺点:

需要在代码编写之前明确选择和引用外部库,可能需要一定的了解和确认,如果没有事先勾选引用库,代码就会报错,不能正常运行

何为后期绑定

后期绑定是指在定义对象变量的时候,不指定特定对象,统统声明为 Object 类型的变量,就是后期期绑定对象。在后期绑定中,不需要事先选择引用,而是使用CreateObject或GetObject函数创建外部库的对象实例。在后期绑定下,不能使用代码提示和自动完成功能。

常用后期绑定对象定义语句,我们也列几个,与前面的前期绑定对应:

' Microsoft Scripting Runtime 对象库(用于字典)
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")


' Microsoft VBScript 正则表达式 5.5 对象库(用于正则表达式)
Dim reExp As Object
Set reExp = CreateObject("VBScript.RegExp")


' Microsoft Scripting Runtime 文件系统对象库(用于文件系统)
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")


' Microsoft Word 对象库(用于Word对象)
Dim wordApp As Object
Set wordApp = CreateObject("Word.Application")


' Adobe Acrobat 对象库(用于Acrobat对象)
Dim AcroApp As Object
Set AcroApp = CreateObject("AcroExch.App")
Dim?AcroPDDoc?As?Object
Set AcroPDDoc = CreateObject("AcroExch.PDDoc")


' Microsoft ADO 数据库对象库(用于Access数据库连接对象)
Dim cnADO As Object
Set cnADO = CreateObject("ADODB.Connection")


'?Microsoft?XML?v6.0?对象库(用于处理和操作XML数据)
Dim xmlDoc As Object
Set?xmlDoc?=?CreateObject("MSXML2.DOMDocument.6.0")

优点:

不需要事先引用外部库,使得代码在不同环境中更加灵活和通用。

避免了版本冲突问题,因为代码在运行时才确定对象的类型。

缺点:

缺乏代码提示和自动完成功能,编写代码时需谨慎,容易出错。

由于运行时需要动态识别对象类型,所以可能稍微降低一些性能。

总结

前期绑定后期绑定各有优缺点,我们该如何选择?

如果我们需要更好的代码提示自动完成功能,并且确定要使用特定版本的外部库,或者对代码的运行效率非常在意,那么可以选择前期绑定。

如果我们需要代码更灵活,或者需要处理不同版本的外部库,或者不确定是否有某个外部库可用,或者说,像今天的问题那样,需要把代码复制到其他文档中去使用的时候,我们可以选择后期绑定。

还有,就看个人习惯,就我个人而言,我还是偏向于后期绑定,原因是勾选动作在代码之外完成,我希望能通过代码解决的问题,就用代码,减少一切人工干预!

另外,顺便提一个对任何人都适用的小建议,如果你向别人提问题咨询的时候,最好能把问题一次性描述清楚,而且要提供关键信息,避免误解,节省彼此的时间。

如果是我碰到类似问题,我可能会这样提问:“我有一段代码,在原来的文件中运行正常,但我把它复制到其他工作簿就报错,请问可能是什么原因呢?”

喜欢就点个、点在看留个言呗!

本文于2023年7月29日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表