Excel VBA嵌套类测试报错求助:对象变量或With块变量未设置
解决Excel VBA嵌套类的“对象变量未设置”错误
嘿,别担心,这个问题其实是因为外部类的属性Get方法写错了,咱们一步步来分析~
错误原因分析
你在cOutside类里声明的Num1和Num2属性是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




