При назначении массивов пользовательских объектов в vba вам необходимо передать их как варианты Я включил полный рабочий образец.
Модуль класса с именем MyType:
Public Once As Integer
Public Twice As Integer
Public Thrice As Integer
Код в стандартном модуле:
Public Function getArray() As MyType()
Dim i As Integer, arr() As MyType
'do a lot of work which returns an array of an unknown length'
'this is O(N^2) or something equally intensive so I only want to call this once'
For i = 0 To Int(Rnd() * 6) + 1
ReDim Preserve arr(i)
Set arr(i) = New MyType
arr(i).Once = i
arr(i).Twice = i * 2
arr(i).Thrice = i * 3
Next i
getArray = arr
MsgBox "Long process complete"
End Function
Public Sub doSomething()
Static myArray() As MyType
Dim i As Integer
If UBound(myArray) = -1 Then
myArray = getArray()
End If
For i = LBound(myArray) To UBound(myArray)
Debug.Print myArray(i).Once & vbTab & _
myArray(i).Twice & vbTab & _
myArray(i).Thrice
Next i
End Sub
Public Sub Test()
Dim i As Integer
For i = 1 To 3
Debug.Print "Run Number " & i & vbCrLf & String(10, "-")
doSomething
Debug.Print
Next i
End Sub
При первом запуске doSomething
будет создан массив произвольной длины, и вы увидите окно с сообщением «Длинный процесс завершен». Последующие вызовы doSomething
будут повторно использовать массив, созданный в первый раз.
Если вы скопируете этот код и просто запустите подпрограмму Test
, она вызовет doSomething
три раза. Вы увидите окно сообщения один раз и три раза вывод doSomething
в ближайшем окне.