new net multidimensional matrices llenar inicializar declarar array arrays class vba return-value byref

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