Объект класса 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