VBA (Excel) initialise le tableau entier sans boucle

je suis assez nouveau à VBA, donc c'est peut-être une question simple, mais voilà.

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

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

Mais si le tableau est grand c'est lourd, et je voudrais initialiser tous les éléments de la même valeur. Idéalement, il serait quelque chose comme ceci:

myArray(:) = 0

j'ai essayé, mais le compilateur se plaint. Puis J'Ai essayé myArray() = 0 et il s'est plaint de ce que, trop.

quelqu'un Peut-il expliquer comment faire, sans boucle<!--18? J'aimerais le faire en une seule instruction, si possible.

Clarification:

je veux initialiser chaque élément du tableau pour certaines valeur initiale. Donc, si j'ai un tableau Dim myArray(300) As Integer de 300 entiers, par exemple, tous les 300 éléments auraient 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 ceci:

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
demandé sur Community 2013-10-12 21:15:54

7 réponses

c'est facile, au moins si vous voulez un tableau de variantes 1-based, 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

tableaux d'Octets également ne sont pas trop mauvais:

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 êtes limité aux seules valeurs qui peuvent être représentées avec un seul octet de répétition:

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, il devient encore plus poilu. Pas vraiment la peine à moins que votre tableau soit des entrées de 50K ou plus. Venez de définir chaque valeur dans une boucle et vous serez rapidement assez comme je l'ai dit dans un réponse précédente.

26
répondu Chel 2017-05-23 12:25:57

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 si c'est votre première fois, alors je vous recommande de visiter Chip Pearson site web.

Qu'est-ce initialiser? Par exemple, si je veux initialiser le tableau sur le 13?

Lorsque vous souhaitez initailize le tableau de 13 éléments, alors vous pouvez le faire en deux façons

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

dans le premier, la limite inférieure du tableau commencerait par 0 vous pouvez donc stocker 13 éléments dans array. Par exemple,

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

Dans le deuxième exemple que vous avez spécifié les limites inférieures comme 1 si 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 dans le tableau est égale à 0. Pour vérifier que l'essai ceci 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

FOLLOWUP FROM COMMENTS

ainsi, dans cet exemple, chaque valeur serait 13. Donc si j'avais un tableau Dim myArray (300) Comme entier, tous les 300 éléments tiendraient la valeur 13

comme je l'ai mentionné, AFAIK, il n'y a pas de moyen direct d'atteindre ce que vous voulez. Ceci étant dit, Voici une façon qui utilise la fonction feuille de travail Rept pour créer une chaîne répétitive de 13. Une fois nous avons cette chaîne, on peut utiliser SPLIT en utilisant "," comme délimiteur. Mais notez que cela crée un tableau variant mais peut être utilisé dans les calculs.

Notez aussi que, dans les exemples suivants myArray conservera en fait 301 valeurs dont la dernière est vide - vous devriez en tenir compte en initialisant cette valeur ou en supprimant le dernier "," de sNum avant Split opération.

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

en utilisant la variante du tableau 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
répondu Siddharth Rout 2018-05-08 21:48:18

je veux initialiser chaque élément du tableau pour certaines valeur initiale. Donc si j'ai un tableau Dim myArray (300) Comme entier de 300 entiers, par exemple, tous les 300 éléments auraient la même valeur initiale (disons, le nombre 13).

quelqu'un Peut-il expliquer comment faire, sans boucle? j'aimerais faire dans une déclaration, si possible.

Que dois-je gagner?

Sub SuperTest()
   Dim myArray
   myArray = Application.Transpose([index(Row(1:300),)-index(Row(1:300),)+13])
End Sub
4
répondu tbur 2014-09-25 19:48:42

cette fonction fonctionne avec des variables pour la taille et la valeur initiale.

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
répondu EEM 2015-05-12 17:02:35

pour VBA vous devez initialiser en deux lignes.

Sub TestArray()

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

End Sub
0
répondu Santosh 2013-10-12 17:21:16

Fantaisie façon de mettre @hygiénistes dentaires de réponse dans une fonction:

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

Et l'utiliser comme ceci:

myArray = arrayZero(15)
0
répondu Filipe 2015-04-14 21:34:11

une méthode qui peut être utilisée pour assigner des valeurs à des éléments entiers d'un tableau est de mettre les données sur une feuille de travail inutilisée et puis relire les valeurs de la feuille de travail dans le tableau. Par exemple, je veux assigner des valeurs de 123 à des éléments entiers d'un tableau 5x5. Voici le code d'une ligne pour mettre en œuvre une telle tâche:

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

même si c'est un peu lent mais ça marche très bien. Vous pouvez également supprimer la déclaration de tableau.

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

En fait, vous pouvez modifier la la valeur de certains éléments. Par exemple, supposons que vous souhaitez modifier la valeur des éléments MyArray(1,1), MyArray(1,5), MyArray(3,3), MyArray(5,1), et, MyArray(5,5) 789, le code sera comme ceci

Range("A1:E5") = 123: Range("A1,E1,C3,A5,E5") = 789: MyArray = Range("A1:E5")
0
répondu Anastasiya-Romanova 秀 2016-07-23 08:55:53