2

少し検索しましたが、同様の十分な質問/回答が見つかりませんでした。だからここに行く:

Project というクラス オブジェクトがあります。プロジェクトには、複数のシナリオを関連付けることができます。

各オブジェクトのクラス モジュールを作成しました。しかし、特定のプロジェクトのシナリオ コレクションをインスタンス化するのは難しいと思います。

クラスモジュールは次のとおりです。

1) cプロジェクト:

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) Scenario クラス オブジェクト:

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

クラス モジュールのビルドで何が間違っていましたか、またはどのように修正すればよいですか? ありがとう。

4

1 に答える 1

1

でアクセスしようとする前pScenariosに、クラスで初期化していません。にイニシャライザを追加することで修正できます。cProjectAdd()cProject

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

これにより、内部でインスタンスを呼び出そうとしたときにcSインスタンスがそうでないことが保証されます。別の方法 (より弱い IMO) は、内部で新規作成した後に設定することです。また、 のプロパティ セッターが ではなく であることを確認してください。NothingAddtest2p.Scenarios = new cScenariosptest2cScenario.parentProperty SetProperty Let

于 2012-08-30T19:10:20.853 に答える