web-dev-qa-db-fra.com

VBA (Excel) Initialise un tableau entier sans boucle

Je suis assez nouveau sur VBA, donc ceci peut être une question simple, mais voilà.

Je voudrais initialiser un tableau entier myArray, disons des entiers, en VBA. Je sais que je peux le faire par une simple initialisation comme ceci:

Dim myArray
myArray = Array(1, 2, 4, 8)

Mais si le tableau est grand, c'est fastidieux et j'aimerais initialiser tous les éléments avec la même valeur. Idéalement, ce serait quelque chose comme ceci:

myArray(:) = 0

J'ai essayé cela mais le compilateur s'est plaint. Ensuite, j'ai essayé myArray() = 0 et il s'est plaint de cela aussi.

Quelqu'un peut-il expliquer comment faire cela, sans boucler? J'aimerais le faire en une seule déclaration si possible.

Clarification:

Je veux initialiser chaque élément du tableau à une valeur initiale. Ainsi, si j'ai un tableau Dim myArray(300) As Integer de 300 nombres entiers, par exemple, tous les 300 éléments auront la même valeur initiale (disons le nombre 13).

Plus de clarification

J'ai trouvé cette réponse qui indique que vous pouvez le faire avec une variable comme celle-ci:

Dim x As Double: x = 0

Peut-être y a-t-il un moyen de mettre à jour légèrement la syntaxe pour la rendre applicable aux tableaux?

34
user1205577

C'est facile, du moins si vous voulez un tableau de variantes basé sur 1, 1D ou 2D:

Sub StuffVArr()
    Dim v() As Variant
    Dim q() As Variant
    v = Evaluate("=IF(ISERROR(A1:K1), 13, 13)")
    q = Evaluate("=IF(ISERROR(A1:G48), 13, 13)")
End Sub

Les tableaux d'octets ne sont pas trop mauvais non plus:

Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" _
        (dest As Any, ByVal size As Long, ByVal fill As Byte)

Sub StuffBArr()
    Dim i(0 To 39) As Byte
    Dim j(1 To 2, 5 To 29, 2 To 6) As Byte
    FillMemory i(0), 40, 13
    FillMemory j(1, 5, 2), 2 * 25 * 5, 13
End Sub

Vous pouvez utiliser la même méthode pour remplir des tableaux d'autres types de données numériques, mais vous n'êtes limité qu'à des valeurs pouvant être représentées avec un seul octet répété:

Sub StuffNArrs()
    Dim i(0 To 4) As Long
    Dim j(0 To 4) As Integer
    Dim u(0 To 4) As Currency
    Dim f(0 To 4) As Single
    Dim g(0 To 4) As Double

    FillMemory i(0), 5 * LenB(i(0)), &HFF 'gives -1
    FillMemory i(0), 5 * LenB(i(0)), &H80 'gives -2139062144
    FillMemory i(0), 5 * LenB(i(0)), &H7F 'gives 2139062143

    FillMemory j(0), 5 * LenB(j(0)), &HFF 'gives -1

    FillMemory u(0), 5 * LenB(u(0)), &HFF 'gives -0.0001

    FillMemory f(0), 5 * LenB(f(0)), &HFF 'gives -1.#QNAN
    FillMemory f(0), 5 * LenB(f(0)), &H80 'gives -1.18e-38
    FillMemory f(0), 5 * LenB(f(0)), &H7F 'gives 3.40e+38

    FillMemory g(0), 5 * LenB(g(0)), &HFF 'gives -1.#QNAN
End Sub

Si vous voulez éviter une boucle dans d'autres situations, cela devient encore plus poilu. Cela ne vaut vraiment pas la peine, sauf si votre tableau contient 50 000 entrées ou plus. Il suffit de définir chaque valeur dans une boucle et vous serez assez rapide assez, comme je l’ai dit dans un réponse précédente .

26
Chel

Vous pouvez initialiser le tableau en spécifiant les dimensions. Par exemple

Dim myArray(10) As Integer
Dim myArray(1 to 10) As Integer

Si vous travaillez avec des tableaux et que c'est votre première fois, je vous conseillerais de visiter le site Web de Chip Pearson .

A quoi initialise-t-il? Par exemple, si je veux initialiser l’ensemble du tableau à 13? 

Lorsque vous souhaitez initialiser le tableau de 13 éléments, vous pouvez le faire de deux manières

Dim myArray(12) As Integer
Dim myArray(1 to 13) As Integer

Dans le premier cas, la limite inférieure du tableau commencerait par 0 afin que vous puissiez stocker 13 éléments dans un tableau. Par exemple

myArray(0) = 1
myArray(1) = 2
'
'
'
myArray(12) = 13

Dans le deuxième exemple, vous avez spécifié les limites inférieures sous la forme 1. Ainsi, votre tableau commence par 1 et peut à nouveau stocker 13 valeurs. 

myArray(1) = 1
myArray(2) = 2
'
'
'
myArray(13) = 13

Lorsque vous initialisez un tableau en utilisant l’une des méthodes ci-dessus, la valeur de chaque élément du tableau est égale à 0. Pour vérifier cela essayez ce code.

Sub Sample()
    Dim myArray(12) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

ou

Sub Sample()
    Dim myArray(1 to 13) As Integer
    Dim i As Integer

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

SUIVI DE COMMENTAIRES

Donc, dans cet exemple, chaque valeur serait 13. Donc, si j'avais un tableau Dim myArray (300) As Integer, tous les 300 éléments contiendraient la valeur 13

Comme je l'ai dit, autant que je sache, il n'y a pas de moyen direct d'atteindre ce que vous voulez. Cela dit, voici un moyen qui utilise la fonction de feuille de calcul Rept pour créer une chaîne répétitive de 13. Une fois que nous avons cette chaîne, nous pouvons utiliser SPLIT en utilisant "," en tant que délimiteur. Mais notez que ceci crée un tableau variant mais peut être utilisé dans des calculs.

Notez également que, dans les exemples suivants, myArray contiendra en réalité 301 valeurs dont la dernière est vide - vous devrez en tenir compte en initialisant cette valeur ou en supprimant le dernier "," de sNum avant l'opération Split.

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    '~~> 13,13,13,13...13,13 (300 times)
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print myArray(i)
    Next i
End Sub

Utilisation du tableau de variantes dans les calculs

Sub Sample()
    Dim sNum As String
    Dim i As Integer
    Dim myArray

    '~~> Create a string with 13 three hundred times separated by comma
    sNum = WorksheetFunction.Rept("13,", 300)
    sNum = Left(sNum, Len(sNum) - 1)

    myArray = Split(sNum, ",")

    For i = LBound(myArray) To UBound(myArray)
        Debug.Print Val(myArray(i)) + Val(myArray(i))
    Next i
End Sub
10
Siddharth Rout

Je veux initialiser chaque élément du tableau à une valeur initiale. Donc, si j'ai un tableau Dim myArray (300) En tant qu'entier de 300 entiers, par exemple, tous les 300 éléments auront la même valeur initiale (par exemple, le nombre 13).

Quelqu'un peut-il expliquer comment faire cela, sans bouclage? Je voudrais le faire en une seule déclaration si possible.

Qu'est-ce que je gagne?

Sub SuperTest()
   Dim myArray
   myArray = Application.Transpose([index(Row(1:300),)-index(Row(1:300),)+13])
End Sub
4
tbur

Cette fonction fonctionne avec des variables de taille et de valeur initiale, elle combine les réponses tbur & Filipe.

Function ArrayIniValue(iSize As Integer, iValue As Integer)
Dim sIndex As String
sIndex = "INDEX(Row(1:" & iSize & "),)"
ArrayIniValue = Evaluate("=Transpose(" & sIndex & "-" & sIndex & "+" & iValue & ")")
End Function

Appelé de cette façon:

myArray = ArrayIniValue(350, 13)
1
EEM

Pour VBA, vous devez initialiser sur deux lignes.

Sub TestArray()

Dim myArray
myArray = Array(1, 2, 4, 8)

End Sub
0
Santosh

Manière élégante de mettre la réponse de @rdhs dans une fonction:

Function arrayZero(size As Integer)
  arrayZero = Evaluate("=IF(ISERROR(Transpose(A1:A" & size & ")), 0, 0)")
End Function

Et utilisez comme ceci:

myArray = arrayZero(15)
0
Filipe

Une méthode qui peut être utilisée pour affecter des valeurs à des éléments entiers d'un tableau consiste à placer les données dans une feuille de calcul inutilisée, puis à relire les valeurs de la feuille de calcul dans le tableau. Par exemple, je souhaite affecter des valeurs de 123 à des éléments entiers d’un tableau 5x5. Voici le code d'une ligne pour implémenter une telle tâche:

ReDim MyArray(1 To 5, 1 To 5): Range("A1:E5") = 123: MyArray = Range("A1:E5")

Bien que ce soit un peu lent mais cela fonctionne bien. Vous pouvez également supprimer la déclaration du tableau.

Range("A1:E5") = 123: MyArray = Range("A1:E5")

En fait, vous pouvez facilement modifier la valeur de certains éléments. Par exemple, supposons que vous souhaitiez modifier la valeur des éléments MyArray (1,1), MyArray (1,5), MyArray (3,3), MyArray (5,1) et MyArray (5,5) en 789. , alors le code sera comme ça

Range("A1:E5") = 123: Range("A1,E1,C3,A5,E5") = 789: MyArray = Range("A1:E5")
0