arrays - multidimensional - vb net new array
VBA: devoluciĆ³n de matriz desde Property Get (2)
En VBA, las matrices nunca se devuelven por referencia a menos que se devuelvan a través de un parámetro ByRef
. Además, cada vez que usa =
para asignar una matriz a una variable, ha creado una nueva copia de la matriz, incluso si la está asignando a un argumento ByRef dentro de un procedimiento, por lo que no tiene suerte. tratando de hacer que esto funcione
Algunas alternativas son ...
- Use una VBA.Collection en lugar de una matriz.
- Cree su propia clase que encapsule una matriz y exhiba los procedimientos para acceder indirectamente y manipular la matriz interna.
Si las matrices se devuelven por referencia, ¿por qué no funciona lo siguiente?
''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
Usted no tiene una propiedad de alquiler. Además, la propiedad get devuelve todo el conjunto, en lugar de solo el elemento en cuestión. Cambie el tipo de devolución de Property Get from Double () a simplemente Double. Agregar propiedad Let. Tenga en cuenta que se necesitan dos entradas, pero solo se le pasa uno. Se supone que la última variable (MyValue, en este caso) obtiene su valor de lo que sea después del signo =. Ponga un punto de corte en algún lugar temprano en Test1 () y vea cómo los valores se ven afectados en la ventana Locales. Compara las variables creadas por el código original versus mi código:
''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