VBA类成员函数返回自身类类型时运行异常问题咨询
VBA类成员函数返回自身类类型失效的排查与解决
类模块(ClassOne)核心错误点
VBA中返回对象类型(如自身类)必须使用Set关键字,这是和返回普通数据类型(如Double)的核心区别,也是最常见的失效原因:
' ClassOne 类模块正确示例代码 Private m_value As Double ' 属性读写封装 Public Property Get Value() As Double Value = m_value End Property Public Property Let Value(ByVal newVal As Double) m_value = newVal End Property ' 返回Double类型的函数(无需Set) Public Function fReadData() As Double m_value = ThisWorkbook.Sheets("Sheet1").Range("C1").Value fReadData = m_value End Function ' 返回ClassOne类型的函数(必须用Set返回) Public Function fReadData2() As ClassOne m_value = ThisWorkbook.Sheets("Sheet1").Range("C1").Value Set fReadData2 = Me ' 返回当前类实例,或创建新实例返回 End Function
主模块测试代码的正确写法
测试函数中接收返回的类对象时,同样必须使用Set关键字,否则会导致对象引用丢失:
' 主模块测试代码 Sub Test() Dim obj As New ClassOne ' 直接写入返回的Double值到C2 ThisWorkbook.Sheets("Sheet1").Range("C2").Value = obj.fReadData() End Sub Sub Test2() Dim obj As New ClassOne Dim resultObj As ClassOne ' 用Set接收返回的ClassOne实例 Set resultObj = obj.fReadData2() ' 将实例的Value属性写入C3 ThisWorkbook.Sheets("Sheet1").Range("C3").Value = resultObj.Value End Sub
其他排查方向
- 确认类模块的名称确实为
ClassOne,避免拼写错误导致的引用失败 - 检查工作表名称(如示例中的
Sheet1)是否与实际工作表一致,防止Range引用错误 - 如果需要返回新的类实例而非当前对象,需确保新实例的属性已正确赋值,示例如下:
Public Function fReadData2() As ClassOne Dim newInstance As New ClassOne newInstance.Value = ThisWorkbook.Sheets("Sheet1").Range("C1").Value Set fReadData2 = newInstance End Function
内容的提问来源于stack exchange,提问作者Petri Lahtinen
相关产品推荐
相关产品推荐

