2012-08-30 70 views
2

我已經搜索了一下,但找不到足夠類似的問題/答案。所以在這裏:類模塊的子對象不適用於excel的vba

我有一個名爲Project的類對象。一個項目可以有多個與之相關的場景。

我已經爲每個對象創建了類模塊。但我相信,在給定項目實例化Scenarios集合時遇到困難。

下面是類的模塊:

1)的CProject:

Private pProjectID As Integer 
Private pName As String 
Private pDateCreated As String 
Private pScenarios As cScenarios 

' PROPERTIES 

Public Property Get ProjectID() As Integer 
    ProjectID = pProjectID 
End Property 
Public Property Let ProjectID(value As Integer) 
    pProjectID = value 
End Property 
Public Property Get name() As String 
    name = pName 
End Property 
Public Property Let name(value As String) 
    pName = value 
End Property 
Public Property Get Scenarios() As cScenarios 
    Set Scenarios = pScenarios 
End Property 
Public Property Set Scenarios(value As cScenarios) 
    Set pScenarios = value 
End Property 

2)cScenarios集合類模塊:

Private pScenarios As Collection 

Private Sub Class_Initialize() 
    Set pScenarios = New Collection 
End Sub 
Private Sub Class_Terminate() 
    Set pScenarios = Nothing 
End Sub 
Public Function Item(index As Variant) As cScenario 
    Set Item = pScenarios.Item(index) 
End Function 
Public Property Get Count() As Long 
    Count = pScenarios.Count 
End Property 
Public Sub Add(obj As cScenario) 
    pScenarios.Add obj 
End Sub 
Public Sub Remove(index As Variant) 
    pScenarios.Remove index 
End Sub 

最後(3)的方案類對象:

Private pScenarioID As Integer 
Private pName As String 
Private pDateCreated As String 
Private pParent As cProject 

Public Property Get ScenarioID() As Integer 
    ScenarioID = pScenarioID 
End Property 
Public Property Let ScenarioID(value As Integer) 
    pScenarioID = value 
End Property 
Public Property Get name() As String 
    name = pName 
End Property 
Public Property Let name(value As String) 
    pName = value 
End Property 
Public Property Get parent() As cProject 
    parent = pParent 
End Property 
Public Property Let parent(value As cProject) 
    pParent = value 
End Property 

這裏是一個標準模塊:

Sub test1() 

Dim cS As cScenarios 
Dim s As cScenario 

Set cS = New cScenarios 

For i = 1 To 3 
    Set s = New cScenario 
    s.name = "s" & i 
    cS.Add s 
Next 

Debug.Print cS.Item(3).name 
Debug.Print cS.Count 

End Sub 

這工作。一切都很好。目前。我可以用多種方案填充cS。但是,如果我將場景集合作爲項目的子對象(請參閱下面的test2()),我會在cs中獲得「運行時錯誤'91':對象變量或塊變量未設置」。添加通話。

Sub test2() 

Dim p As cProject 
Dim cS As cScenarios 
Dim s As cScenario 

Set p = New cProject 
Set cS = p.Scenarios 

For i = 1 To 3 
    Set s = New cScenario 
    s.name = "s" & i 
    cS.Add s 
Next 

Debug.Print cS.Item(3).name 
Debug.Print cS.Count 

End Sub 

我做錯了什麼建立我的課程模塊和/或如何解決它?謝謝。

+0

您在場景類中的「父」屬性應該使用「Set」來分配和返回值(並且「Property Let parent'應該是屬性集父值) –

回答

1

在嘗試使用Add()訪問它之前,您尚未初始化pScenarios中的cProject類。 您可以修復,通過增加一個初始化到cProject

Private Sub Class_Initialize() 
    Set pScenarios = New cScenarios 
End Sub 

這將保證cS實例不會被Nothing當您嘗試它調用Addtest2。 另一種方式(較弱的海事組織)將在test2內新建p後設置p.Scenarios = new cScenarios。 此外,請確保cScenario.parent的屬性設置器是Property Set而不是Property Let