晚绑定全局变量?

时间:2018-05-15 15:56:23

标签: vba access-vba

我正在使用VBA for Excel。根据我的理解,全局变量需要在任何潜艇之外声明。这是所有潜艇都可以访问的唯一方式。

与此同时,我想做晚期绑定以引用" Microsoft Scripting Runtime"库(为了使用字典对象类型),以便最终用户不必自己完成。

我的代码如下:

On Error Resume Next
strGUID = "{420B2830-E718-11CF-893D-00A0C9054228}"
ThisWorkbook.VBProject.References.AddFromGuid GUID:=strGUID, Major:=1, Minor:=0

Dim Dic1 As Object
Set Dic1 = CreateObject("Scripting.Dictionary")
Dim Dic2 As Object
Set Dic2 = CreateObject("Scripting.Dictionary")

如果我想用后期绑定声明全局字典对象怎么办?看起来VBA不允许我把任何代码放在sub之外(声明除外)。

如何在不需要最终用户自己配置库引用的情况下声明全局字典对象?我要不要以下?

Dim Dic1 As Object
Dim Dic2 As Object

Sub Prog1()
    On Error Resume Next
    strGUID = "{420B2830-E718-11CF-893D-00A0C9054228}"
    ThisWorkbook.VBProject.References.AddFromGuid GUID:=strGUID, Major:=1, Minor:=0

    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
End Sub

2 个答案:

答案 0 :(得分:7)

与VBA代码本身一样,当用户打开主机工作簿时,项目引用不会神奇地消失。它们与主机文档中的代码一起保存。

因此,您的问题的前提是错误的:用户永远不需要调整项目引用。

此外,Scripting Runtime类型库是标准问题,并且在本世纪构建的每台Windows机器上(甚至在此之前)都提供了完全相同的版本,这意味着除非您的代码需要在Mac上运行,否则会出现这种情况。不需要对Scripting Runtime库进行后期绑定。

如果您的代码需要在Mac上运行,那么该库无论如何都不会后期绑定,因为它无法在主机上找到,所以后期绑定Scripting Runtime只能用于制作愚蠢的错别字并引入 IntelliSense 帮助预防的其他容易避免的错误。

ThisWorkbook.VBProject.References.AddFromGuid GUID:=strGUID, Major:=1, Minor:=0

这违背了后期绑定的全部目的:它使用VBIDE可扩展性库(需要降低的宏安全性设置)以编程方式添加您可以在设计时通过VBE轻松添加的引用&#39 ; s 工具菜单。

后期编码根本不需要参考。不是在编译时,不是在运行时。

添加引用,保存,然后声明对象As Scripting.Dictionary并享受早期代码的好处。

Set Dic1 = New Scripting.Dictionary

这就是你所需要的一切。

  

如果我想用后期绑定声明全局字典对象怎么办?看起来VBA不允许我把任何代码放在sub之外(声明除外)。

后期绑定与该方面的早期绑定没有任何不同。迟到和早期绑定代码之间的唯一差异是声明的As子句:

Private foo As Object ' no compile-time type knowledge: late-bound
Private bar As Dictionary ' compile-time type knowledge: early-bound

如何初始化该对象引用对声明的后期/早期绑定性质没有影响。

这会在注册表中查找ProgID以查找库和类型:

Set foo = CreateObject("Scripting.Dictionary")

这使用项目引用:

Set foo = New Scripting.Dictionary

两者都是正确的,两者都可以对抗早期或晚期声明。但是,如果您已经引用了类型库,那么就不需要去注册表找到该库 - 只需要New它就可以了!

答案 1 :(得分:2)

实际上不需要全局变量,应该避免使用。但是,如果您出于自己的原因决定使用它们,则可以将它们放入Workbook_Open事件:

Option Explicit

Dim Dic1 As Object
Dim Dic2 As Object

Private Sub Workbook_Open()

    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")

End Sub

因此,每次打开工作簿时都会创建对象。