redim llenar example ejemplo dinamico create array arrays vba

arrays - llenar - vba array dinamico



¿Cómo declaro una variable de matriz en VBA? (7)

Necesito agregar el var en array

Public Sub Testprog() Dim test As Variant Dim iCounter As Integer If test = Empty Then iCounter = 0 test(iCounter) = "test" Else iCounter = UBound(test) End If End Sub

Obteniendo error en la test(iCounter) = "test"

Por favor sugiere alguna solución


Además de la respuesta de Cody Gray, hay una tercera vía (todo lo aplica también):

También puede usar una matriz dinámica que se redimensiona sobre la marcha:

Dim test() as String Dim arraySize as Integer Do While someCondition ''...whatever arraySize = arraySize + 1 ReDim Preserve test(arraySize) test(arraySize) = newStringValue Loop

Tenga en cuenta la palabra clave Preserve . Sin ella, redimensionar una matriz también inicializa todos los elementos.


Además de la respuesta de RolandTumble a la respuesta de Cody Gray, ambas respuestas, esta es otra manera muy simple y flexible, cuando conoces todos los contenidos de la matriz en el momento de la codificación, por ejemplo, solo quieres construir una matriz que contenga 1, 10, 20 y 50. Esto también usa declaración de variantes, pero no usa ReDim. Al igual que en la respuesta de Roland, el recuento enumerado del número de elementos de la matriz no necesita ser específicamente conocido, pero se puede obtener mediante el uso de uBound.

sub Demo_array() Dim MyArray as Variant, MyArray2 as Variant, i as Long MyArray = Array(1, 10, 20, 50) ''The key - the powerful Array() statement MyArray2 = Array("Apple", "Pear", "Orange") ''strings work too For i = 0 to UBound(MyArray) Debug.Print i, MyArray(i) Next i For i = 0 to UBound(MyArray2) Debug.Print i, MyArray2(i) Next i End Sub

Me encanta esto más que cualquiera de las otras formas de crear matrices. Lo mejor es que puedes agregar o quitar miembros de la matriz en la instrucción Array, y no se necesita hacer nada más con el código. Para agregar Huevo a su matriz de alimentos de 3 elementos, simplemente escriba

, "Huevo"

en el lugar apropiado, y listo. Su matriz de alimentos ahora tiene los 4 elementos, y nada tuvo que modificarse en Dim, y ReDim se omite por completo.

Si no se desea una matriz basada en 0, es decir, usando MyArray (0), una solución es simplemente poner un 0 o "" para ese primer elemento.

Tenga en cuenta que esto podría ser mal considerado por algunos puristas de la codificación; Una buena objeción sería que los "datos duros" deberían estar en las declaraciones de Const, no en las declaraciones de los códigos en las rutinas. Otra cuestión podría ser que, si insertas 36 elementos en una matriz, deberías establecer un const a 36, ​​en lugar de codificar ignorando eso. La última objeción es discutible, porque impone un requisito para mantener el Const con 36 en lugar de depender de uBound. Si agrega un 37º elemento pero deja el Const en 36, es posible que haya problemas.


Como señalaron otros, su problema es que no ha declarado una matriz

A continuación, he intentado recrear su programa para que funcione como lo desea. Intenté dejar tanto como fuera posible (como dejar tu matriz como una variante)

Public Sub Testprog() ''"test()" is an array, "test" is not Dim test() As Variant ''I am assuming that iCounter is the array size Dim iCounter As Integer ''"On Error Resume Next" just makes us skip over a section that throws the error On Error Resume Next ''if test() has not been assigned a UBound or LBound yet, calling either will throw an error '' without an LBound and UBound an array won''t hold anything (we will assign them later) ''Array size can be determined by (UBound(test) - LBound(test)) + 1 If (UBound(test) - LBound(test)) + 1 > 0 Then iCounter = (UBound(test) - LBound(test)) + 1 ''So that we don''t run the code that deals with UBound(test) throwing an error Exit Sub End If ''All the code below here will run if UBound(test)/LBound(test) threw an error iCounter = 0 ''This makes LBound(test) = 0 '' and UBound(test) = iCounter where iCounter is 0 '' Which gives us one element at test(0) ReDim Preserve test(0 To iCounter) test(iCounter) = "test" End Sub


David, viene el error Microsoft Office Excel ha dejado de funcionar. Dos opciones verifican una solución en línea y cierran el programa y otra opción. Cierre el programa. Estoy seguro de que el error está en mi matriz, pero estoy leyendo todo y parece que esta es la forma de definir las matrices.


Debes declarar la variable de matriz como una matriz:

Dim test(10) As Variant


El índice Array solo acepta un valor largo.

Usted declaró iCounter como un número entero. Debes declararlo como un largo.


En general, debe declarar variables de un tipo específico , en lugar de Variant . En este ejemplo, la variable de test debe ser de tipo String .

Y, como es una matriz, debe indicarlo específicamente cuando declare la variable. Hay dos formas de declarar variables de matriz:

  1. Si conoce el tamaño de la matriz (la cantidad de elementos que debería contener) cuando escribe el programa, puede especificar ese número entre paréntesis en la declaración:

    Dim test(1) As String ''declares an array with 2 elements that holds strings

    Este tipo de matriz se conoce como una matriz estática , ya que su tamaño es fijo o estático.

  2. Si no conoce el tamaño de la matriz cuando escribe la aplicación, puede usar una matriz dinámica . Una matriz dinámica es aquella cuyo tamaño no se especifica en la declaración (instrucción Dim ), sino que se determina más tarde durante la ejecución del programa utilizando la ReDim . Por ejemplo:

    Dim test() As String Dim arraySize As Integer '' Code to do other things, like calculate the size required for the array '' ... arraySize = 5 ReDim test(arraySize) ''size the array to the value of the arraySize variable