【问题标题】:Declare a dictionary without Microsoft Scripting Runtime声明没有 Microsoft 脚本运行时的字典
【发布时间】:2014-10-27 07:10:38
【问题描述】:

我确实有一个主 Excel VBA 程序,它调用具有后期绑定的子例程,因为已知原因,使用工具->参考-> Microsoft 脚本运行时是不可行的。

Main Program    
Dim Dict As Object
Set Dict = CreateObject("Scripting.Dictionary")
Call SubRoutine(Dict)

下一步是将字典发送到我的子例程

Public Sub SubRoutine(Dict As Scripting.Dictionary)
do something
end

将导致预期的编译错误,因为我没有对 Microsoft Scripting Runtime 的引用。 现在的问题是,如何解决该问题以声明字典。 通过使用

Set Dict = CreateObject("Scripting.Dictionary")

会清空字典。

【问题讨论】:

  • 使用Public Sub SubRoutine(Dict As Object)
  • ;-) 试过这个,但它改变了类型。使用 Reference the Locals Window 将字典显示为类型 Dictionary/Dictionary。作为对象,它是对象/字典。这对我没有帮助,我需要字典。
  • 在我的测试中它工作正常。 它改变了类型是什么意思?
  • 如果我使用 Microsoft Scripting Runtime with tools->references 来编译和运行代码,您可以通过 view->Locals Window 看到 dict 的类型是 Dictionary/Dictionary。但是这个我不能用。因此更改为 SubRoutine(Dict As Object) 会更改类型
  • Object/Dictionary 正是后期绑定所应具备的。这意味着该变量是一个Object,它可以引用any 对象类型。 /Dictionary 表示它当前正在引用字典

标签: excel vba dictionary


【解决方案1】:

您实际上是在询问如何使用后期绑定而不是早期绑定(one article discussing thismore articles)。

而不是以下,这意味着早期绑定(即设置对 Microsoft Scripting Runtime 库的显式引用):

Public Sub SubRoutine(Dict As Scripting.Dictionary)

您需要将 Sub 的参数声明为通用 Object 类型,这在使用后期绑定时是必需的(即没有显式引用集,让程序在运行时解决问题):

Public Sub SubRoutine(Dict As Object)

Object 视为一个可以容纳任何类型对象的容器——但是一旦你将一个对象放入其中,例如Dictionary,然后就是这样。在 Locals 窗口中,它将显示为 Object/Dictionary,这意味着容器是 Object(这与您基本上无关,不用担心)但性质/行为是 Dictionary(这是您想要的) .

附录:最后一句话并不像我想象的那么真实。请参阅后续问题中的解释:Runtime Error with Dictionary when using late binding but not early binding

【讨论】:

  • 对我来说听起来可行,但后来在代码中我遇到了更多问题。我所做的是将字典放入带有Arr(c) = Dict.Keys(c) 的数组中。 Array 被定义为 Variant,它也应该可以工作。编译器现在显示运行时错误 451:Property let procedure not defined 和 property get Procedure did not return an object。它适用于Public Sub SubRoutine(Dict As Scripting.Dictionary),但不适用于Public Sub SubRoutine(Dict As Object)
  • 这是一个新问题——请照原样发布。如果它有助于您的原始问题,也请考虑接受此答案。 How does accepting work?
猜你喜欢
  • 2019-08-10
  • 2017-06-05
  • 1970-01-01
  • 2013-10-06
  • 2011-08-18
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多