2012-08-07 3 views
2

Я пытаюсь реализовать наследование в VBA следующим образом -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

Это должно работать, как ожидается, на какой линии будет ошибка, вы вступили в objCRng.RangeName? –

+0

Да, я вступил в objCRng.RangeName. Я получаю ошибку, когда пытаюсь назначить «Range1» – vkrams

+0

Если я создаю эти классы, ваш код отлично работает с модулем, есть ли другой код? –

ответ

6

Как Ури сказал, 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 
+0

Спасибо Дик, я понял, я не использовал ключевое слово «Установить», где я должен использовать его в другой части кода. Задача решена. – vkrams

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 
+0

Привет, Ури, он по-прежнему дает ту же ошибку. – vkrams

+0

Спасибо Ури, я понял, я не использовал ключевое слово «Установить», где я должен использовать его в другой части кода. Проблема решена – vkrams

Смежные вопросы