Hinzufügen eines Elements am Ende eines Arrays


14

Ich möchte am Ende eines VBA-Arrays einen Wert hinzufügen. Wie kann ich das machen? Ich konnte online kein einfaches Beispiel finden. Hier ist ein Pseudocode, der zeigt, was ich tun möchte.

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

Ist die Idee, Werte am Ende eines vorhandenen Arrays hinzuzufügen? Oder ist es wie in Ihrem Beispiel, in dem Sie nur einen Bereich in ein Array laden möchten? Wenn letzteres der Fall ist, warum nicht den Einzeiler verwenden arr = Range.Value?
Excellll

Antworten:


10

Versuchen Sie dies [BEARBEITET]:

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

Danke , aber leider funktioniert das nicht das UBound(arr)erfordert , dass arrmit einiger dimenstion zB initialisiert wird , Dim arr(1) As Variantaber dann später die ReDim Preserveversagt und sagt , dass das Array bereits dimensioniert ist? Mit anderen Worten, Sie können ein Array in VBA nicht reduzieren?
Megloff


Nun, das Beispiel von msdn funktioniert auch nicht in Excel VBA. gleichen Fehler, beschwert sich, dass Array bereits dimensioniert ist
Megloff

Es sieht so aus, als ob ich anstelle eines Arrays a verwenden Collectionund es anschließend in ein Array konvertieren sollte. Irgendwelche anderen Vorschläge?
Megloff

2
Vielen Dank, aber es funktioniert immer noch nicht auf diese Weise, da, wie bereits erwähnt UBound(arr), ein bereits dimensioniertes Array erforderlich ist. Nun, es sieht so aus, als müsste ich stattdessen eine Sammlung verwenden.
Trotzdem

8

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

2
Wenn Sie eine Sammlung verwenden möchten, können Sie auch ein Wörterbuchobjekt verwenden. `Set col = CreateObject (" Scripting.Dictionary ")` Dann können Sie die Schlüssel direkt als Array ausgeben und Ihre hinzugefügte Funktion überspringen: `arr = col.keys` <= Array
B Hart

3

So mache ich es mit einer Variant (Array) -Variablen:

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

Wenn Sie tatsächlich ein Array von Varianten benötigen (um beispielsweise 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

danke, ReDim arr (0 bis 0) zu verwenden und dann das nächste Element zuzuweisen, hat für mich funktioniert
Vasile Surdu

1

Wenn Ihr Bereich ein einzelner Vektor ist und die Anzahl der Zeilen in einer Spalte weniger als 16.384 beträgt, 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

0

Danke. Das Gleiche mit 2 Funktionen tun, 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


0
Dim arr()  As Variant: ReDim Preserve arr(0) ' Create dynamic array

' Append to dynamic array function
Function AppendArray(arr() As Variant, var As Variant) As Variant
    ReDim Preserve arr(LBound(arr) To UBound(arr) + 1) ' Resize array, add index
    arr(UBound(arr) - 1) = var ' Append to array
End Function
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.