You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Excel VBA嵌套类测试报错求助:对象变量或With块变量未设置

解决Excel VBA嵌套类的“对象变量未设置”错误

嘿,别担心,这个问题其实是因为外部类的属性Get方法写错了,咱们一步步来分析~

错误原因分析

你在cOutside类里声明的Num1Num2属性是cInside对象类型,但对应的Property Get方法却返回了m_Num1.Value(这是一个Integer值),而不是返回m_Num1这个对象本身!

  • 当你调用o.Num1.Inc时,o.Num1实际拿到的是一个整数,不是cInside对象,自然找不到Inc方法,就会抛出「对象变量或With块变量未设置」的错误。
  • 而且VBA里对于类对象类型的属性,Property Get必须用Set关键字来返回对象引用,否则会出现类型不匹配的隐式转换,导致对象丢失。

修正后的代码

外部类模块 cOutside

' CLASS MODULE - cOutside
' Member variables
Private m_Num1 As New cInside
Private m_Num2 As New cInside

' Properties
Property Get Num1() As cInside
    ' 用Set返回对象引用,而不是属性值
    Set Num1 = m_Num1
End Property

Property Get Num2() As cInside
    Set Num2 = m_Num2
End Property

Property Set Num1(i As cInside)
    Set m_Num1 = i
End Property

Property Set Num2(i As cInside)
    Set m_Num2 = i
End Property

主程序(无需修改,现在可正常运行)

Sub Main()
    Dim o As New cOutside
    Dim i As New cInside
    
    i.Value = 9
    i.Inc
    Debug.Print i.Value '<-- this works
    
    Set o.Num1 = i
    o.Num1.Inc '<-- 现在可以正常调用了
    Debug.Print (o.Num1.Value) ' 会输出11
End Sub

关键总结

当属性的类型是自定义类对象时,Property Get必须使用Set来返回对象实例,而不是直接返回对象的某个属性值。你之前的代码把对象的Value属性返回给了对象类型的属性,导致类型不匹配、对象引用丢失,最终触发了错误。

内容的提问来源于stack exchange,提问作者Helloguys

火山引擎 最新活动