VBA Excel宏无法创建SortedList

时间:2019-12-16 20:17:40

标签: excel vba com-interop

我有一个在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

2 个答案:

答案 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引用来解决它。