Я хочу предложить другой хороший способ сделать это, используя Collection
и static Property
без необходимости использовать класс :
представьтевы хотите иметь перечисление xlCVError
в виде массива (или коллекции), например, чтобы проходить через него при ошибках и обрабатывать его на основе фактической ошибки.
При доступе инициализируется один раз:
'from https://stackoverflow.com/a/56646199/1915920
Static Property Get XlCVErrorColl() As Collection
Dim c As Collection 'will be already initalized after 1st access
'because of "Static Property" above!
Set XlCVErrorColl = c
If Not c Is Nothing Then Exit Property
'initialize once:
Set c = New Collection
c.Add XlCVError.xlErrDiv0
c.Add XlCVError.xlErrNA
c.Add XlCVError.xlErrName
c.Add XlCVError.xlErrNull
c.Add XlCVError.xlErrNum
c.Add XlCVError.xlErrRef
c.Add XlCVError.xlErrValue
Set XlCVErrorColl = c
End Property
Превратить это в массив или реализовать его в виде массива просто, но коллекции кажутся мне более полезными, с тем недостатком, что их элементы не проверяются неявно / проверяется тип (время компиляции).
Так что это, например, превратит его в массив (только для чтения) (с недостатком in-mem-copy-недостатка, упомянутым в других ответах / комментариях):
'from https://stackoverflow.com/a/56646199/1915920
Static Property Get XlCVErrorArr() As XlCVError()
Dim a() As XlCVError
XlCVErrorArr = a
If UBound( a ) > 0 Then Exit Property
'initialize once:
Dim c As Collection: Set c = XlCVErrorColl
ReDim a(c.Count)
Dim i As Integer: For i = 1 To c.Count
a(i) = c(i)
Next i
XlCVErrorArr = a
End Function
Таким образом, преобразование примера из Clayton S s answer в статическое, изменяемое свойство модуля с использованием некоторого массива будет следующим:
'module (no class required)
'from https://stackoverflow.com/a/56646199/1915920
Private v() As Double
Static Property Get Vec(index As Long) As Double
If UBound(v) < 3 Then 'initialize once:
ReDim v(0 To 3) 'one could initialize it with anyting after here too
end if
Vec = v(index)
End Property
Public Property Let Vec(index As Long, MyValue As Double)
v(index) = MyValue
End Property