我试图以下列方式在VBA中实现继承 -
我有一个课程模块clsRange
,如下所示
Private strRngName as String
Public Property Let RangeName(ByVal thisRangeName As String)
strRngName = thisRangeName
End Property
Public Property Get RangeName() As String
RangeName= strRngName
End Property
另一个类模块clsChildRange
private rngHolder as New clsRange
Public Property Get RangeName() As String
Set RangeName = rngHolder.RangeName
End Property
Public Property Let RangeName(ByVal thisRangeName As String)
rngHolder.RangeName = thisRangeName
End Property
我有一个模块,因为我正在尝试为clsChildRange创建一个对象,并尝试以下列方式设置clsRange的属性
Dim objCRng as New clsChildRange
objCRng.RangeName= "Range1"
但我得到一个错误 - 对象变量或没有设置块变量。
答案 0 :(得分:6)
正如Uri所说,rngHolder没有实例化导致问题。不要测试Null,而是测试Is Nothing。根据你想要完成的任务,有两种方法可以做到这一点。
明确设置范围
在CRange
Private msRngName As String
Public Property Let RngName(ByVal sRngName As String): msRngName = sRngName: End Property
Public Property Get RngName() As String: RngName = msRngName: End Property
在CChildRange
Private mclsRange As CRange
Public Property Set Range(ByVal clsRange As CRange): Set mclsRange = clsRange: End Property
Public Property Get Range() As CRange: Set Range = mclsRange: End Property
Public Property Get RngName() As String
If Not Me.Range Is Nothing Then
RngName = Me.Range.RngName
End If
End Property
Public Property Let RngName(sName As String)
If Not Me.Range Is Nothing Then
Me.Range.RngName = sName
End If
End Property
然后在标准模块中
Sub test()
Dim clsRange As CRange
Dim clsChildRange As CChildRange
'Create a new CRange instance
Set clsRange = New CRange
'Create a new CChildRange instance
Set clsChildRange = New CChildRange
'Set the Range property to the CRange instance
Set clsChildRange.Range = clsRange
'Set the RngName property of the chile
clsChildRange.RngName = "Range1"
'Test that the parent has the property set
Debug.Assert clsRange.RngName = "Range1"
End Sub
隐式设置范围
CRange是一样的。
在CChildRange
Private mclsRange As CRange
Public Property Set Range(ByVal clsRange As CRange): Set mclsRange = clsRange: End Property
Public Property Get Range() As CRange: Set Range = mclsRange: End Property
Public Property Get RngName() As String
RngName = Me.Range.RngName
End Property
Public Property Let RngName(sName As String)
Me.Range.RngName = sName
End Property
Private Sub Class_Initialize()
Set mclsRange = New CRange
End Sub
Private Sub Class_Terminate()
Set mclsRange = Nothing
End Sub
然后在标准模块中
Sub test()
Dim clsChildRange As CChildRange
'Create a new CChildRange instance
'Range object created when class is created
Set clsChildRange = New CChildRange
'Set the RngName property of the chile
clsChildRange.RngName = "Range1"
'Test that the parent has the property set
Debug.Assert clsChildRange.Range.RngName = "Range1"
End Sub
答案 1 :(得分:1)
我怀疑rngHolder成员在这件事上没有初始化,试试这段代码
private rngHolder as clsRange
Public Property Get RangeName() As String
If rngHolder=Null Then Set rngHolder=New clsRange
Set RangeName = rngHolder.RangeName
End Property
Public Property Let RangeName(ByVal thisRangeName As String)
If rngHolder=Null Then Set rngHolder=New clsRange
rngHolder.RangeName = thisRangeName
End Property