在PC上引发Excel VBA 438错误,但在Mac上未引发

时间:2019-06-11 18:02:48

标签: excel vba

我有VBA代码,该代码将自定义Edge类对象添加到词典的字典中。我正在使用this Dictionary class

这在Mac上可以正常使用,但是当我尝试在PC上运行电子表格命令时,出现438: Object doesn't support this property or method错误。

引发错误的代码行是edges_dict(user)(Provider) = created_edge,其中edges_dict(user)是字典,Provider是字符串,creaded_edge是Edge。

如果我改用edges_dict(user).Add Provider, created_edge,则一切正常,但我希望第一个调用提供覆盖功能。此外,edges_dict(key) = value也可以工作。这个问题似乎是由于我的嵌套而引起的。

这是我创建词典字典的代码:

Public edges_dict As New Dictionary 'Stores in degrees
Public s_array() As String

Public single_node As Dictionary 'Dictionary keyed by source node holding in degree edges for a certain node

Sub Generate_Matrix()


    'Code to populate s_array() here

    'Populate dictionary with key as node, value as array of inbound edges to be filled
    Set single_node = New Dictionary

        edges_dict.Add s_array(I), single_node 

    Next I

End Sub

1 个答案:

答案 0 :(得分:5)

edges_dict(user)(Provider) = created_edge

发生了很多 ,塞满了那个小指令。如果任一密钥查找失败,您如何知道哪个密钥失败?你不知道,你也不知道。

将其拆分,试图将尽可能多的功能压缩到一条指令中是没有用的。

Dim providers As Dictionary
Set providers = edges_dict.Item(user)

作为奖励,您可以获得 IntelliSense 和早期绑定功能!

  

creaded_edge一个边缘。

假设一个Edge是一个对象,则该错误与Win32代码不会因错误438而爆炸-该错误与Mac代码“正在工作”有关,当它绝对应该抱怨缺少默认成员时在Edge类上。

该错误间接告诉您需要一个Set关键字来分配该对象引用:

Set providers(provider) = created_edge

如果没有Set关键字,您将强制created_edge对象,这意味着与该键关联的字典项不是“工作”的Mac代码上的对象,而是任何数据类型该类的默认成员是...假设它具有一个默认成员(并且没有...所以尚不清楚Mac代码如何/为什么不会爆炸)-这是您的“嵌套”指令,并在方括号中包含隐式代码:

[Let] edges_dict[.Item](user)[.Item](Provider) = created_edge[.DefaultMember]

.Add在这两种情况下均有效的原因是,在这种情况下没有发生强制转换:对象引用本身被添加为值。

引发错误438是因为强制没有具有默认成员(似乎是这种情况)的对象应该失败。

在作业前添加Set可以解决问题...但与.Add的行为不同:.Add会抛出重复键如果您尝试重新添加现有键,则会出现错误,同时像分配键一样分配键值时,将默默地替换与现有键关联的值。