使用后期绑定但不是早期绑定时使用Dictionary的运行时错误

Exc*_*bie 4 excel vba dictionary

我所做的是将字典放入Sub Routine中的数组中

这就是定义

Dim Arr() As Variant
ReDim Arr(0 To Dict.Count - 1)
For c= 0 To Dict.Count - 1 
   Arr(c) = Dict.Keys(c) ' <~~~~~~ Error here
Next c 
Run Code Online (Sandbox Code Playgroud)

编译说

运行时错误451:属性let过程未定义,属性get过程未返回对象.

它非常适合

Public Sub SubRoutine(Dict As Scripting.Dictionary) 
Run Code Online (Sandbox Code Playgroud)

但没有

Public Sub SubRoutine(Dict As Object) –
Run Code Online (Sandbox Code Playgroud)

请参阅声明没有Microsoft Scripting Runtime的字典

Jea*_*ett 7

<Solution>

你做这个

Dim Arr() As Variant
ReDim Arr(0 To Dict.Count - 1)
For c = 0 To Dict.Count - 1
    Arr(c) = Dict.Keys(c)
Next c
Run Code Online (Sandbox Code Playgroud)

但是像这样的循环是非常不必要的.这是什么Arr = Dict.Keys.所以,而不是上述,只是做

Dim Arr As Variant
Arr = Dict.Keys
Run Code Online (Sandbox Code Playgroud)

额外的好处是,这会使错误消失.

</Solution>


但为什么错误发生在代码的后期绑定版本而不是早期绑定?

<Educated guess>

通过早期绑定,编译器知道.Keys方法不带参数 - 它只返回一个数组.所以它解释Dict.Keys(c){returned array}(c)并返回c返回数组的th元素.

使用后期绑定,我猜对象容器不知道该.Keys方法不接受参数(又称参数),因此c它作为参数发送给它.但是没有定义这样的getter(或setter),因此错误.为了解决这个问题,你可以通过说明强制它不向Keys方法发送参数Dict.Keys()(c),这会带来{returned array}(c)行为.

</Educated guess>

这是我第一次碰到这样的情况,其中后期绑定代码的行为与早期绑定不同.