[英]VBA Excel macro can't create SortedList
我有一个在 Excel 中运行并使用 SortedList 的 VBA 宏。 在大多数机器上它运行良好。 一方面,线
Dim myEvents As New SortedList
导致 myEvents 的值为 Nothing。 线
myEvents = createobject("system.collections.sortedlist")
导致“自动化错误”。 mscorlib.dll 在我的参考文献中并被检查。
有人知道发生了什么吗? 由于宏适用于其他机器,我认为这一定是系统设置问题,但我不知道它可能是什么。
OS Name Microsoft Windows 10 Pro
Version 10.0.18362 Build 18362
System Model Surface Laptop
System Type x64-based PC
Dim myEvents As New SortedList
对于早期绑定的、 自动实例化的声明导致myEvents
为Nothing
,事情需要非常非常非常破碎。
因为在创建自动实例化对象的那一刻,您永远无法测试它是否为Nothing
并获得True
- 这个断言永远无法满足,因为仅在表达式中引用myEvents
就足以让 VBA 去重新实例化该对象在它评估Is Nothing
之前:
Debug.Assert myEvents Is Nothing
您只能使用对定义此类的类型库的项目引用将某些内容声明As SortedList
。
myEvents = createobject("system.collections.sortedlist")
这里有两个问题:一,缺少Set
关键字。 我们正在分配一个对象引用, Set
是必需的。 接下来是使用CreateObject
来创建在已加载和引用的库中定义的类型的New
实例:编译器已经知道在哪里可以找到该类型,但是无论如何您都要让它点击 Windows 注册表来查找。 改为New
它,并为未引用的库中定义的内容保留CreateObject
。
Set myEvents = New SortedList
假设参考是正确的,这应该就是你所需要的。
mscorlib.dll 在我的参考文献中并被检查。
不是 DLL,而是 TLB。 它必须是要运行它的计算机的正确位数,并且正确的位数必须与主机应用程序(即 Excel)的位数相匹配。
您不能提前绑定到C:\\Windows\\Microsoft.NET\\Framework64\\
并让它在 32 位 Excel 中工作。 而且你不能提前绑定到C:\\Windows\\Microsoft.NET\\Framework\\
并让它在 64 位 Excel 中工作。
如果您的某些用户使用的是不同位数的 Office 安装,请修复他们的安装以匹配其他人的安装,或者删除引用并使用后期绑定:
Dim myEvents As Object
Set myEvents = CreateObject("System.Collections.SortedList")
不利的一面是,您将在黑暗中编码,没有编译器帮助和附近的文档。
从好的方面来说,后期绑定代码应该适用于所有 Windows 系统。
我有一个类似的问题,结果证明问题是在找不到 mscorlib 之前的参考,在这种情况下,工具 > 参考页面有“缺少:Microsoft Excel 16.0 对象库”。 我通过取消选中丢失的库,选择确定然后重新添加 mscorlib 引用来解决它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.