web-dev-qa-db-fra.com

Comment déclarer une variable de tableau dans VBA?

J'ai besoin d'ajouter le var dans le tableau

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

Obtenir une erreur à test(iCounter) = "test"

S'il vous plaît suggérer une solution

24
Vba Dev

En règle générale, vous devez déclarer les variables de type type spécifique, plutôt que Variant. Dans cet exemple, la variable test devrait être de type String.

Et, comme il s’agit d’un tableau, vous devez l’indiquer précisément lorsque vous déclarez la variable. Il existe deux manières de déclarer des variables de tableau:

  1. Si vous connaissez la taille du tableau (le nombre d'éléments qu'il doit contenir) lors de l'écriture du programme, vous pouvez spécifier ce nombre entre parenthèses dans la déclaration:

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

    Ce type de tableau est appelé un tableau statique , car sa taille est fixe ou statique.

  2. Si vous ne connaissez pas la taille du tableau lorsque vous écrivez l'application, vous pouvez utiliser un tableau dynamique . Un tableau dynamique est un tableau dont la taille n'est pas spécifiée dans la déclaration (instruction Dim), mais qui est déterminée ultérieurement au cours de l'exécution du programme à l'aide de l'instruction ReDim. Par exemple:

    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
    
32
Cody Gray

En plus de la réponse de Cody Gray, il y a une troisième façon (tout y est également valable):

Vous pouvez également utiliser un tableau dynamique redimensionné à la volée:

Dim test() as String
Dim arraySize as Integer

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

Notez le mot clé Preserve. Sans cela, redimensionner un tableau initialise également tous les éléments.

12
RolandTumble

Comme l'ont souligné d'autres personnes, votre problème est que vous n'avez pas déclaré de tableau

Ci-dessous, j'ai essayé de recréer votre programme afin qu'il fonctionne comme vous le souhaitiez. J'ai essayé de laisser autant que possible tel qu'il était (par exemple, en laissant votre tableau en 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
6
Alter

En complément de la réponse de RolandTumble à la réponse de Cody Gray, les deux bonnes réponses, voici un autre moyen très simple et flexible, lorsque vous connaissez tout le contenu du tableau au moment du codage - par exemple. vous voulez simplement construire un tableau contenant 1, 10, 20 et 50. Ceci utilise également une déclaration de variante, mais pas ReDim. Comme dans la réponse de Roland, le nombre énuméré du nombre d'éléments de tableau n'a pas besoin d'être spécifiquement connu, mais peut être obtenu en utilisant 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

J'aime plus que tout autre moyen de créer des tableaux. Ce qui est génial, c’est que vous pouvez ajouter ou soustraire des membres du tableau directement dans l’instruction Array. Aucune autre opération n’est nécessaire pour coder. Pour ajouter Egg à votre gamme de 3 éléments alimentaires, il vous suffit de taper

, "Oeuf"

à l'endroit approprié, et vous avez terminé. Votre gamme de produits alimentaires contient maintenant les 4 éléments, et rien ne doit être modifié dans Dim, et ReDim est entièrement omis.

Si un tableau basé sur 0 n’est pas souhaité - c’est-à-dire en utilisant MyArray (0) - une solution consiste simplement à bloquer un 0 ou un "" pour ce premier élément.

Notez que cela pourrait être mal perçu par certains puristes du codage; Une objection juste serait que les "données concrètes" devraient être dans les instructions Const, pas dans les instructions de code dans les routines. Un autre problème pourrait être que, si vous collez 36 éléments dans un tableau, vous devez définir un const à 36, plutôt que du code ignorant cela. Cette dernière objection est discutable, car elle impose de maintenir le Const avec 36 plutôt que de s’appuyer sur uBound. Si vous ajoutez un 37ème élément mais laissez le Const à 36, des problèmes sont possibles.

Vous devez déclarer la variable de tableau comme un tableau:

Dim test(10) As Variant
2
Mark Cidade