visual vbnet una matriz llenar ejemplos ejemplo dinamico como arreglos arreglo array arrays vba

arrays - vbnet - llenar un arreglo visual basic



Poblar matrices dinĂ¡micas VBA (5)

El siguiente código me da el error 9 "subíndice fuera de rango". Quise declarar una matriz dinámica para que la dimensión cambie a medida que agrego elementos a ella. ¿Debo crear una "mancha" en la matriz antes de almacenar algo en ella como en JS?

Sub test_array() Dim test() As Integer Dim i As Integer For i = 0 To 3 test(i) = 3 + i Next i End Sub


Además de los útiles comentarios de Cody, vale la pena señalar que a veces no sabrá qué tan grande debe ser su matriz. Las dos opciones en esta situación son

  1. Creando una matriz lo suficientemente grande como para manejar cualquier cosa que creas será lanzada
  2. Uso Redim Preserve de Redim Preserve

El código a continuación proporciona un ejemplo de una rutina que dimensionará myArray en línea con la variable lngSize , luego agregará elementos adicionales (igual al tamaño de la matriz inicial) mediante el uso de una prueba Mod cuando el límite superior esté a punto de ser excedido

Option Base 1 Sub ArraySample() Dim myArray() As String Dim lngCnt As Long Dim lngSize As Long lngSize = 10 ReDim myArray(1 To lngSize) For lngCnt = 1 To lngSize*5 If lngCnt Mod lngSize = 0 Then ReDim Preserve myArray(1 To UBound(myArray) + lngSize) myArray(lngCnt) = "I am record number " & lngCnt Next End Sub


Póster por primera vez, lector de mucho tiempo. Como mencionaron Cody y Brett, podrías reducir la ralentización de VBA con el uso sensato de Redim Preserve . Brett sugirió a Mod que hiciera esto.

También puede usar un Type y Sub definido por el usuario para hacer esto. Considera mi código a continuación:

Public Type dsIntArrayType eElems() As Integer eSize As Integer End Type Public Sub PushBackIntArray( _ ByRef dsIntArray As dsIntArrayType, _ ByVal intValue As Integer) With dsIntArray If UBound(.eElems) < (.eSize + 1) Then ReDim Preserve .eElems(.eSize * 2 + 1) End If .eSize = .eSize + 1 .eElems(.eSize) = intValue End With End Sub

Esto llama a ReDim Preserve solo cuando el tamaño se ha duplicado. La variable miembro eSize realiza un seguimiento del tamaño real de datos de eElems . Este enfoque me ha ayudado a mejorar el rendimiento cuando la longitud final de la matriz no se conoce hasta el tiempo de ejecución.

Espero que esto ayude a otros también.


Sí, está buscando la ReDim , que asigna dinámicamente la cantidad de espacio requerida en la matriz.

La siguiente declaración

Dim MyArray()

declara una matriz sin dimensiones, por lo que el compilador no sabe qué tan grande es y no puede almacenar nada dentro de ella.

Pero puede usar la ReDim para cambiar el tamaño de la matriz:

ReDim MyArray(0 To 3)

Y si necesita cambiar el tamaño de la matriz conservando su contenido, puede usar la palabra clave Preserve junto con la ReDim :

ReDim Preserve MyArray(0 To 3)

Pero tenga en cuenta que tanto ReDim como particularmente ReDim Preserve tienen un alto costo de rendimiento. Intente evitar hacer esto una y otra vez en un ciclo si es posible; tus usuarios te lo agradecerán

Sin embargo, en el ejemplo simple que se muestra en su pregunta (si no es solo una muestra desechable), no necesita ReDim en absoluto. Simplemente declare la matriz con dimensiones explícitas:

Dim MyArray(0 To 3)


Veo muchas (todas) las publicaciones anteriores que dependen de llamadas de LBound / UBound a una matriz dinámica de VBA potencialmente no inicializada, lo que causa la muerte inevitable de la aplicación ...

Código errático:

Dim x As Long Dim arr1() As SomeType ... x = UBound(arr1) ''crashes

Código correcto:

Dim x As Long Dim arr1() As SomeType ... ReDim Preserve arr1(0 To 0) ... x = UBound(arr1)

... es decir, cualquier código donde Dim arr1() es seguido inmediatamente por LBound(arr1) / UBound(arr1) llamadas sin ReDim arr1(...) en el medio, se bloquea. La rotonda debe emplear un On Error Resume Next y comprobar el número Err.Number justo después de la LBound(arr1) / UBound(arr1) - debería ser 0 si la matriz se inicializa; de lo contrario, no es cero. Debido a que existe una mala conducta incorporada de VBA, se necesita una mayor verificación de los límites de la matriz. Una explicación detallada puede leer todo el mundo en el sitio web de Chip Pearson (que debe ser celebrado como el Tesoro de la Sabiduría VBA de la humanidad ...)

Je, esa es mi primera publicación, creo que es legible.


en su bucle for use un Redim en la matriz como aquí:

For i = 0 to 3 ReDim Preserve test(i) test(i) = 3 + i Next i