VBA将类实例存入Dictionary后取值异常,寻求排查方案
问题原因与解决方案
嘿,这个问题我太熟了——你踩了VBA中对象引用的经典坑!
为什么会输出两个10?
VBA里的自定义类(比如你的cOgg)属于引用类型,而不是值类型(比如Integer、String这种)。你从头到尾只创建了一个cOgg实例:
Dim oMat As New cOgg
虽然你两次调用sosdb.Add,但字典里存储的是这个实例的内存引用,而不是对象的副本。所以当你第一次添加"uno"后,修改oMat的属性,其实是直接修改了字典里那个实例的内容;第二次添加"due"时,只是把同一个实例的引用又存了一次。最后字典里的两个键指向的都是同一个对象,自然输出的都是最后修改的10。
怎么解决?
你需要每次添加到字典前,都创建一个新的cOgg实例,而不是复用同一个oMat变量。修改后的代码如下:
Sub pivo() Dim oMat As cOgg ' 先声明变量,不要在这里直接New Dim sosdb As New Dictionary ' 第一次创建实例并赋值 Set oMat = New cOgg oMat.desc = "unodesc" oMat.alt = 5 sosdb.Add "uno", oMat ' 第二次创建新的实例并赋值 Set oMat = New cOgg oMat.desc = "duedesc" oMat.alt = 10 sosdb.Add "due", oMat Debug.Print sosdb("uno").alt ' 输出5 Debug.Print sosdb("due").alt ' 输出10 End Sub
关键点说明
- 把
Dim oMat As New cOgg改成Dim oMat As cOgg,然后每次需要新实例时用Set oMat = New cOgg手动创建,这样每次都是独立的对象。 - 不需要循环处理,问题完全出在对象实例化的时机上——你之前复用了同一个实例,导致字典里的条目共享同一个对象。
内容的提问来源于stack exchange,提问作者Gotrekk
相关产品推荐
相关产品推荐

