Je voudrais ajouter une valeur à la fin d'un tableau VBA. Comment puis-je faire ceci? Je n'ai pas pu trouver un exemple simple en ligne. Voici un pseudocode indiquant ce que j'aimerais pouvoir faire.
Public Function toArray(range As range)
Dim arr() As Variant
For Each a In range.Cells
'how to add dynamically the value to end and increase the array?
arr(arr.count) = a.Value 'pseudo code
Next
toArray= Join(arr, ",")
End Function
J'ai résolu le problème en utilisant une collection et je l'ai ensuite copié dans un tableau.
Dim col As New Collection
For Each a In range.Cells
col.Add a.Value ' dynamically add value to the end
Next
Dim arr() As Variant
arr = toArray(col) 'convert collection to an array
Function toArray(col As Collection)
Dim arr() As Variant
ReDim arr(0 To col.Count-1) As Variant
For i = 1 To col.Count
arr(i-1) = col(i)
Next
toArray = arr
End Function
Essayez ceci [édité]:
Dim arr() As Variant ' let brackets empty, not Dim arr(1) As Variant !
For Each a In range.Cells
' change / adjust the size of array
ReDim Preserve arr(1 To UBound(arr) + 1) As Variant
' add value on the end of the array
arr (UBound(arr)) = a.value
Next
Voici comment je le fais en utilisant une variable Variant (tableau):
Dim a As Range
Dim arr As Variant 'Just a Variant variable (i.e. don't pre-define it as an array)
For Each a In Range.Cells
If IsEmpty(arr) Then
arr = Array(a.value) 'Make the Variant an array with a single element
Else
ReDim Preserve arr(UBound(arr) + 1) 'Add next array element
arr(UBound(arr)) = a.value 'Assign the array element
End If
Next
Ou, si vous avez réellement besoin d'un tableau de variants (pour passer à une propriété telle que Shapes.Range, par exemple), vous pouvez le faire comme suit:
Dim a As Range
Dim arr() As Variant
ReDim arr(0 To 0) 'Allocate first element
For Each a In Range.Cells
arr(UBound(arr)) = a.value 'Assign the array element
ReDim Preserve arr(UBound(arr) + 1) 'Allocate next element
Next
ReDim Preserve arr(LBound(arr) To UBound(arr) - 1) 'Deallocate the last, unused element
Si votre plage est un vecteur unique et que, dans une colonne, le nombre de lignes est inférieur à 16 384, vous pouvez utiliser le code suivant:
Option Explicit
Public Function toArray(RNG As Range)
Dim arr As Variant
arr = RNG
With WorksheetFunction
If UBound(arr, 2) > 1 Then
toArray = Join((.Index(arr, 1, 0)), ",")
Else
toArray = Join(.Transpose(.Index(arr, 0, 1)), ",")
End If
End With
End Function
THX. Faire la même chose avec 2 fonctions si cela peut aider d'autres noobs comme moi:
Collection
Function toCollection(ByVal NamedRange As String) As Collection
Dim i As Integer
Dim col As New Collection
Dim Myrange As Variant, aData As Variant
Myrange = Range(NamedRange)
For Each aData In Myrange
col.Add aData '.Value
Next
Set toCollection = col
Set col = Nothing
End Function
Tableau 1D:
Function toArray1D(MyCollection As Collection)
' See http://superuser.com/a/809212/69050
If MyCollection Is Nothing Then
Debug.Print Chr(10) & Time & ": Collection Is Empty"
Exit Function
End If
Dim myarr() As Variant
Dim i As Integer
ReDim myarr(1 To MyCollection.Count) As Variant
For i = 1 To MyCollection.Count
myarr(i) = MyCollection(i)
Next i
toArray1D = myarr
End Function
Usage
Dim col As New Collection
Set col = toCollection(RangeName(0))
Dim arr() As Variant
arr = toArray1D(col)
Set col = Nothing
La réponse est dans la réponse acceptée dans (sans le problème ReDim):
https://stackoverflow.com/questions/12663879/adding-values-to-variable-array-vba
En résumé:
Dim aArray() As Single ' or whatever data type you wish to use
ReDim aArray(1 To 1) As Single
If strFirstName = "henry" Then
aArray(UBound(aArray)) = 123.45
ReDim Preserve aArray(1 To UBound(aArray) + 1) As Single
End If