晚绑定全局变量?

Hel*_*uys 3 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")
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 7

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

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

此外,Scripting Runtime类型库是标准问题,并且在本世纪构建的每台Windows机器上(甚至在此之前)都提供完全相同的版本,这意味着除非您的代码需要在Mac上运行,否则无需延迟 - 绑定Scripting Runtime库.

如果你的代码需要在Mac上运行,那么库无论如何都不会后期绑定,因为它不会在主机上找到,所以后期绑定Scripting Runtime只会造成愚蠢的错别字并引入其他容易避免的错误IntelliSense有助于防止的错误.


ThisWorkbook.VBProject.References.AddFromGuid GUID:=strGUID, Major:=1, Minor:=0
Run Code Online (Sandbox Code Playgroud)

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

后期绑定代码根本不需要引用.不是在编译时,不是在运行时.

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

Set Dic1 = New Scripting.Dictionary
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的.


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

晚期结合与该方面的早期结合没有任何不同.迟到和早期绑定代码之间的唯一区别是As声明的条款:

Private foo As Object ' no compile-time type knowledge: late-bound
Private bar As Dictionary ' compile-time type knowledge: early-bound
Run Code Online (Sandbox Code Playgroud)

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

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

Set foo = CreateObject("Scripting.Dictionary")
Run Code Online (Sandbox Code Playgroud)

这使用项目引用:

Set foo = New Scripting.Dictionary
Run Code Online (Sandbox Code Playgroud)

两者都是正确的,两者都可以对抗早期或晚期声明.除了,如果你已经有了类型库的引用,那么就没有必要去注册表找到那个库 - 就New这么做!