我有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
答案 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
会抛出重复键如果您尝试重新添加现有键,则会出现错误,同时像分配键一样分配键值时,将默默地替换与现有键关联的值。