Ich möchte dem Ende eines VBA-Arrays einen Wert hinzufügen. Wie kann ich das machen? Ich konnte kein einfaches Beispiel online finden. Hier ist ein Pseudocode, der zeigt, was ich gerne tun würde.
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
Ich habe das Problem mithilfe einer Sammlung gelöst und anschließend in ein Array kopiert.
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
Versuchen Sie dies [EDITED]:
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
So mache ich das mit einer Variant (Array) -Variable:
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
Oder wenn Sie tatsächlich ein Array von Varianten benötigen (um es an eine Eigenschaft wie Shapes.Range zu übergeben), können Sie dies folgendermaßen tun:
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
Wenn Ihr Bereich ein einzelner Vektor ist und die Anzahl der Zeilen in einer Spalte geringer als 16.384 ist, können Sie den folgenden Code verwenden:
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
Vielen Dank. Mach dasselbe mit 2 Funktionen, wenn es anderen Noobs wie mir helfen kann:
Sammlung
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
1D Array:
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
Verwendungszweck
Dim col As New Collection
Set col = toCollection(RangeName(0))
Dim arr() As Variant
arr = toArray1D(col)
Set col = Nothing
Die Antwort ist in der akzeptierten Antwort in (ohne das ReDim-Problem):
https://stackoverflow.com/questions/12663879/adding-values-to-variable-array-vba
Zusammenfassend:
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