我正在使用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)
与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这么做!
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |