2011-04-17 13 views
21

tengo que añadir el var en orden¿Cómo declaro una variable de matriz en VBA?

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 

Se obtiene un error en test(iCounter) = "test"

Para sugerir alguna solución

Respuesta

2

Hay que declarar la variable de matriz como una matriz:

Dim test(10) As Variant 
30

En general, debe declarar variables de un tipo específico , ra más que Variant. En este ejemplo, la variable test debe ser del tipo String.

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

  1. Si conoce el tamaño de la matriz (el número de elementos que debe contener) cuando se escribe el programa, se puede especificar que el 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 refiere como un matriz estática , como su tamaño es fijo, o estática.

  2. Si no conoce el tamaño de la matriz al escribir 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 (declaración Dim), sino que se determina más adelante durante la ejecución del programa utilizando la instrucción 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 
    
+7

El número entre paréntesis es 'UBound()' de la matriz superior al enlace en lugar del tamaño. Si Option Base 0 (que es el valor predeterminado), estos valores están fuera por 1. – Caltor

10

con la respuesta de Cody gris, hay una tercera vía (todo lo que hay a su aplica también):

También puede utilizar una dinámica gama que se cambia el tamaño de la mosca :

Dim test() as String 
Dim arraySize as Integer 

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

Nota del Preserve palabra clave. Sin ella, redimensionar una matriz también inicializa todos los elementos.

-3

El índice de matriz solo acepta un valor largo.

Declaraste iCounter como un número entero. Debes declararlo como un largo.

+7

Esto no es cierto en realidad –

6

Como se ha señalado por otros, el problema es que no se ha declarado una matriz

A continuación he intentado recrear su programa para que funcione como se pretende. me trató de salir tanto como sea posible, ya que era (como salir de su 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 
-1

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

4

Además de la respuesta de RolandTumble a la respuesta de Cody Gray, ambas respuestas, esta es otra forma muy simple y flexible, cuando se conocen todos los contenidos de la matriz en el momento de la codificación, p. solo quiere 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 arreglos. 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 gama de alimentos de 3 elementos, sólo tiene que teclear

, "huevo"

en el lugar adecuado, y ya está. 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.

Nota, esto podría ser mal visto 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.

+0

No entiendo el problema con las etiquetas de código anteriores, si alguien puede arreglarlo, gracias. Gracias aún si puedes explicar el problema con la forma incorrecta. – MicrosoftShouldBeKickedInNuts

+0

Los bloques de código en Desbordamiento de pila se formatean al sangrar las líneas con 4 espacios. También puede hacer clic en el icono del corsé en el editor. Hay más información sobre Stack Overflow [página de ayuda de formateo] (http://stackoverflow.com/help/formatting). –

+1

Gracias, Brandon, tu explicación es acertada, y ese es un enlace realmente excelente. y después de su edición, ahora la publicación se ve bien. Espero que también se beneficie de mi publicación; desde que descubrí este método, nunca tuve que preocuparme por las otras formas de crear matrices en VBA. - MSBKIN – MicrosoftShouldBeKickedInNuts

Cuestiones relacionadas