繁体   English   中英

VBA Excel 宏无法创建 SortedList

[英]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

对于早期绑定的、 自动实例化的声明导致myEventsNothing ,事情需要非常非常非常破碎。

因为在创建自动实例化对象的那一刻,您永远无法测试它是否为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM