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?
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 .
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
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
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)
Pour VBA, vous devez initialiser sur deux lignes.
Sub TestArray()
Dim myArray
myArray = Array(1, 2, 4, 8)
End Sub
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)
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")