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
- Creando una matriz lo suficientemente grande como para manejar cualquier cosa que creas será lanzada
- Uso
Redim Preserve
deRedim 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