2

我正在尝试通过以下方式在 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"

但我得到一个错误 - 对象变量或未设置块变量。

4

2 回答 2

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
于 2012-08-07T16:20:11.063 回答
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
于 2012-08-07T11:56:21.713 回答