VBA - 从Property Get返回数组

Tho*_*eod 13 arrays vba class return-value byref

如果通过引用返回数组,为什么不能执行以下操作:

'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
Run Code Online (Sandbox Code Playgroud)

Cla*_*n S 30

你没有let属性.此外,get属性返回整个数组,而不仅仅是有问题的元素.将属性Get的返回类型从Double()更改为plain Double.添加属性让.请注意,它需要两个输入,但只传递一个输入.假设最后一个变量(在本例中为MyValue)从=符号后面的任何值获取它的值.在Test1()的早期某处放置一个断点,看看这些值在Locals窗口中是如何受到影响的.比较原始代码与我的代码创建的变量:

'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  
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比公认的答案更有用的答案.谢谢 :) (3认同)

Ste*_*sen 12

在VBA中,除非通过ByRef参数返回,否则永远不会通过引用返回数组.此外,无论何时使用=将数组分配给变量,您都已经创建了一个数组的新副本,即使您将其分配给过程内部的ByRef参数,所以您几乎没有运气使这项工作.

一些替代方案是......

  • 使用VBA.Collection而不是数组.
  • 创建自己的类,封装数组并公开用于间接访问和操作内部数组的过程.

  • @ThomasMcLeod VBA规范确认数组在赋值时被浅层复制,除了数组中的对象和类实例,请参阅http://msdn.microsoft.com/en-us/library/ee157009(prot.20).aspx (2认同)