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