You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:16:30