【发布时间】:2015-09-24 12:02:55
【问题描述】:
我在 vba 中访问字典中的项目时遇到问题。
我有以下字典:
Dim CResults as dictionary
我添加项目:
CResults.add currentkey, result
Currentkey 是我自己从一个名为 DCRkey 的类中创建的对象
Private loadcase as long
Private csystem as String
Private node as long
而result 是来自名为DCR 的类的另一个对象:
Private Fs as double
Private C1 as double
Private C2 as double
...
然后我尝试使用
访问项目Dim accesskey as DCRKey
accesskey.loadcase=10
accesskey.node = 2000
accesskey.csystem="Global"
Sheets("Results").cells(i,1).value= CResults(accesskey).C1
这就是我遇到错误的地方:runtime error 424 object required
然后我想也许我搜索的键和项目没有导入,所以我决定在 Excel 工作表上显示我的整个字典:
Dim testkey as variant
dim i as integer
i=1
with worksheet("Test")
For each testkey in CResults.keys
.cells(i,1)=test.node
.cells(i,2)=test.loadcase
.cells(i,3)=test.csystem
.cells(i,4)=Cresults(testkey).C1
.cells(i,5)=Cresults(testkey).Fs
if accesskey.loadcase=testkey.loadcase and accesskey.node=testkey.node and accesskey.csystem=testkey.csystem then
Msgbox "This key is the same as the accesskey"
End if
i=i+1
Next
End with
我看到的是:
- 我之前搜索的键存在于字典中:在工作表上进行目视检查
- 我之前搜索的键确实存在于字典中:
"This key is the same as the acceskey"显示一次 - 从
for each循环访问字典中的项目是可行的,因为 C1 和 Fs 在工作表上正确显示
然后我想可能是因为testkey被定义为一个变体而不是DCRKey,所以我尝试了:
dim a as variant
Set a = currentkey
.Cells(i,1) = CResults(a).C1
但它不起作用,我仍然得到runtime error 424。
我也尝试过:
CResults.exists(accesskey)
它返回 false 并在字典中创建一个新条目(顺便说一句,我讨厌这样做),使用与 acceskey 相同的键和一个空项。
所以我的问题是:为什么使用自定义类型键访问项目在 for each 循环中而不是在独立调用中有效。我错过了什么?该代码与我编写的代码非常相似,但并不完全相同(为了您更好地理解)。告诉我您是否认为真正的代码可以提供帮助。
感谢您的帮助。
【问题讨论】:
-
真正的代码总是比你实际使用的代码要好得多。 ;)
-
一个直接的问题:您是否使用 same object 作为访问该项目的键,就像您将它添加到字典时使用的那样?如果没有,您将收到该错误。
-
我不确定我是否理解你的问题。关键是
DCRKey实例化项目本身是DCR实例化,我并没有真正访问项目本身,而是通过 CResults(accesskey).C1 直接访问其属性之一。C1 -
查看 mielk 的回答。这就是我要问的 - 我认为您正在使用
DCRKey类的不同实例来访问该项目。它必须是您在添加项目时用作键的同一实例。 -
我刚看到。我现在明白了谢谢。
标签: vba excel dictionary key