2012-08-07 2 views
2

Je suis en train de mettre en œuvre l'héritage en VBA de la manière suivante -VBA - essayer de mettre en œuvre l'héritage

J'ai un module de classe clsRange comme indiqué ci-dessous

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 

Un autre module de classe 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 

J'ai un module, En ce que j'essaye de créer un objet pour clsChildRange et essaye de placer les propriétés de clsRange dans le suivant chemin

Dim objCRng as New clsChildRange 

objCRng.RangeName= "Range1" 

Mais j'obtiens une erreur - variable d'objet ou avec une variable de bloc non définie.

+0

Cela devrait fonctionner comme prévu, sur quelle ligne est l'erreur, avez-vous entré dans objCRng.RangeName? –

+0

oui je suis entré dans objCRng.RangeName. J'obtiens l'erreur où j'essaye d'assigner "Range1" – vkrams

+0

Si je crée ces classes votre code fonctionne bien d'un module, y at-il d'autre code? –

Répondre

6

Comme le dit Uri, rngHolder n'est pas instancié qui est à l'origine du problème. Ne pas tester pour Null, mais test de Is Nothing. Voici deux façons de le faire, en fonction de ce que vous essayez d'accomplir.

EXPLICITEMENT la gamme

Dans 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 

Dans 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 

ensuite dans un module standard

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 

Définir implicitement la plage

CRange est identique.

Dans 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 

ensuite dans un module standard

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

Merci Dick, je l'ai compris, je n'ai pas utilisé le mot-clé "Set" où je dois l'utiliser dans une autre partie du code. Problème résolu. – vkrams

1

Je soupçonne que le membre rngHolder ne reçoit pas initialisé à ce sujet, essayez ce code

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

Salut Uri, il donne toujours la même erreur. – vkrams

+0

Merci Uri, je l'ai compris, je n'ai pas utilisé le mot-clé "Set" où je dois l'utiliser dans une autre partie du code. Résoudre le problème – vkrams

Questions connexes