Объект класса VBA () как свойство другого класса

Я пытаюсь создать класс для хранения переменного количества элементов (которые сами являются другим объектом класса).

Итак, у меня есть 2 класса:

' Class 2 contain each individual quote elements (OTC and MRC)

Private pOTC As String
Private pMRC As String
Public Property Get OTC() As String
    OTC = pOTC
End Property
Public Property Let OTC(Value As String)
    pOTC = Value
End Property

Public Property Get MRC() As String
    MRC = pMRC
End Property
Public Property Let MRC(Value As String)
    pMRC = Value
End Property

тогда класс 1 содержит массив класса 2:

Private pCurr As String
Private pQuote(20) As Class2

Public Property Get Curr() As String
    Curr = pCurr
End Property
Public Property Let Curr(Value As String)
    pCurr = Value
End Property

Public Property Set Quote(Index As Integer, cQuote As Class2)
    Set pQuote(Index) = cQuote
End Property

Public Property Get Quote(Index As Integer) As Class2
    Quote = pQuote(Index)
End Property

и то, что я хотел бы сделать что-то вроде:

Dim myQuotes As Class1
Set myQuotes = New Class1

myQuotes.Curr = "GBP"
myQuotes.Quote(3).OTC = "1200"  

первая строка установка myQuotes.Curr не проблема, однако, когда я пытаюсь установить значение внутри массива, следующие ошибки строки с объект времени выполнения 91 переменная или переменная блока With не задано

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

спасибо заранее!

3 ответов


когда вы myQuotes.Quote(3) вы называете Property Get Quote что есть проблема.

ваш внутренний массив Class2 не создается экземпляр так pQuote(Index) относится к элементу массива Nothing, после myQuotes.Quote(3).OTC = вы пытаетесь назначить Nothing, который терпит неудачу.

вы должны убедиться, что pQuote(Index) экземпляр; вы можете сделать это по требованию:

Public Property Get Quote(Index As Integer) As Class2
   If (pQuote(Index) Is Nothing) Then Set pQuote(Index) = New Class2
   Set Quote = pQuote(Index)
End Property

(обратите внимание на обязательную Set)

или путем добавления процедуры intitialisation к Class1:

Private Sub Class_Initialize()
    Dim Index As Long
    For Index = 0 To UBound(pQuote)
         Set pQuote(Index) = New Class2
    Next
End Sub

вам нужно установить их как новый Class2 в Class1:

For intI = LBOUND(pQuote) to UBOUND(pQuote)
    Set pQuote(intI) =  New Class2
Next IntI

Так же, как и с класс 1 в окончательном варианте сценария.


возможно, это должно быть

Public Property Let Quote(Index As Integer, cQuote As Class2)
    Set pQuote(Index) = cQuote
End Property