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:
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.
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 laReDim
. 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