VBA-возвращаемый массив из свойства Get
Если массивы возвращаются по ссылке, почему не работает следующее:
'Class1 class module
Private v() As Double
Public Property Get Vec() As Double()
Vec = v()
End Property
Private Sub Class_Initialize()
ReDim v(0 To 3)
End Sub
' end class module
Sub Test1()
Dim c As Class1
Set c = New Class1
Debug.Print c.Vec()(1) ' prints 0 as expected
c.Vec()(1) = 5.6
Debug.Print c.Vec()(1) ' still prints 0
End Sub
2 ответов
в VBA массивы никогда не возвращаются по ссылке, если они не возвращаются через . Кроме того, всякий раз, когда вы используете =
чтобы назначить массив переменной, вы сделали новую копию массива, даже если вы назначаете его аргументу ByRef внутри процедуры, поэтому вам в значительной степени не повезло, пытаясь сделать эту работу.
некоторые альтернативы...
- используйте VBA.Коллекцию вместо массива.
- сделать свой собственный класс это инкапсулирует массив и предоставляет процедуры для косвенного доступа и управления внутренним массивом.
у вас нет собственности. Кроме того, свойство get возвращает весь массив, а не только соответствующий элемент. Измените возвращаемый тип свойства Get с Double () На просто Double. Добавить Свойство Let. Обратите внимание, что он принимает два входа, но только один передается ему. Предполагается, что последняя переменная (MyValue, в данном случае) получает свое значение из того, что находится после знака=. Поместите точку останова где-нибудь в начале Test1 () и посмотрите, как влияют на значения в локальных окно. Сравните переменные, созданные исходным кодом, с моим кодом:
'Class1 class module
Private v() As Double
Public Property Get Vec(index As Long) As Double
Vec = v(index)
End Property
Public Property Let Vec(index As Long, MyValue As Double)
v(index) = MyValue
End Property
Private Sub Class_Initialize()
ReDim v(0 To 3)
End Sub
' end class module
'Begin module
Sub Test1()
Dim c As Class1
Set c = New Class1
Debug.Print c.Vec(1) ' prints 0 as expected
c.Vec(1) = 5.6
Debug.Print c.Vec(1) ' prints 5.6
End Sub
'End module