我在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
循环中工作而不是在独立调用中 . 我错过了什么?这段代码与我编写的代码非常相似但不完全相同(为了让您更好地理解) . 如果您认为真正的代码可以提供帮助,请告诉我 . 谢谢你的帮助 .
1 回答
您需要记住,类的两个实例不是同一个,即使它们的所有属性都设置为相同的值 .
我们来看下面的例子:
在此示例中,
DCRKey
类的两个对象都将所有属性设置为相同的值 . 但是,它们与下面的代码在最后运行Debug.Prints
之后看到的对象不同 .在那些
Debug.Print
使用VBA内置函数ObjPtr
. 此函数的目的是返回指向给定对象的指针 . 对象的每个实例都有自己唯一的指针,因此如果下面的代码打印了两个不同的指针,则表示这些对象不相同 .现在,让我们考虑另一个例子:
在这里,我们将一个新的类
DCRKey
实例分配给变量key1
,然后我们将相同的对象分配给变量key2
. 现在ObjPtr
应该为key1
和key2
返回相同的值,因为这是同一个对象,它只是分配给两个不同的变量 .现在,让我们回到词典 .
The way how dictionary search for the key of Object type is by its pointer.
因此,如果要在字典中查找添加了对象作为键的条目,则需要使用完全相同的对象(而不是具有相同属性的对象) .
例: