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

tau*_*rus 2 excel vba

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

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

的代码提高错误的行是edges_dict(user)(Provider) = created_edge其中edges_dict(user)是一个字典,Provider一个字符串,及creaded_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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

edges_dict(user)(Provider) = created_edge
Run Code Online (Sandbox Code Playgroud)

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

拆分它,尝试将尽可能多的功能压缩为一条指令没有用。

Dim providers As Dictionary
Set providers = edges_dict.Item(user)
Run Code Online (Sandbox Code Playgroud)

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

creaded_edge边缘。

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

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

Set providers(provider) = created_edge
Run Code Online (Sandbox Code Playgroud)

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

[Let] edges_dict[.Item](user)[.Item](Provider) = created_edge[.DefaultMember]
Run Code Online (Sandbox Code Playgroud)

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

错误438被抛出,因为松懈强迫一个对象具有默认成员(似乎是这样),被认为失败。

Set在分配的前面添加将解决此问题...但是,其行为与.Add:相同:如果您尝试重新添加现有的键,.Add则会抛出重复的键错误,而像您那样分配键值将无提示地替换该值与现有密钥相关联。