我有一个在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
答案 0 :(得分:0)
Dim myEvents As New SortedList
要使myEvents
成为Nothing
的早期绑定auto-instantiated声明,事情必须非常非常非常破碎。
因为创建了一个自动实例化的对象,您永远无法对其进行测试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")
不利的一面是,您将在黑暗中进行编码,无需编译器帮助,并且附近有documentation。
从好的方面来说,后期绑定代码应该在所有Windows系统上都可以工作。
答案 1 :(得分:0)
我遇到了类似的问题,结果发现问题出在未找到mscorlib之前是参考,在这种情况下,工具>参考页面具有“ MISSING:Microsoft Excel 16.0 Object Library”。我通过取消丢失的库,选择“确定”,然后重新添加mscorlib引用来解决它。