2014-09-08 14:39:54 +0000 2014-09-08 14:39:54 +0000
14
14
Advertisement

Door een element toe te voegen aan het einde van een array

Advertisement

wil ik een waarde toevoegen aan het einde van een VBA array. Hoe kan ik dit doen? Ik was niet in staat om een eenvoudig voorbeeld online te vinden. Hier is een pseudocode die laat zien wat ik graag zou willen doen.

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
Advertisement
Advertisement

Antwoorden (7)

10
10
10
2014-09-08 14:50:15 +0000

Probeer deze [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
8
8
8
2014-09-09 12:00:57 +0000

Ik heb het probleem opgelost door een Collection te gebruiken en het daarna te kopiëren naar een array.

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
3
Advertisement
3
3
2015-01-15 23:33:57 +0000
Advertisement

Dit is hoe ik het doe, met behulp van een Variant (array) variabele:

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

of, als je daadwerkelijk een array van Varianten nodig hebt (om door te geven aan een eigenschap als Shapes.Range, bijvoorbeeld), dan kun je het op deze manier doen:

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
1
1
1
2014-09-09 20:08:52 +0000

Als uw bereik een enkele vector is, en als het aantal rijen in een kolom minder dan 16.384 is, kunt u de volgende code gebruiken:

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
Advertisement
0
0
2019-08-09 05:00:33 +0000
Advertisement
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
0
0
0
2014-10-04 17:03:12 +0000

Thx. Hetzelfde doen met 2 functies als het andere noobs zoals ik kan helpen :

Collectie

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 Serie :

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

Gebruik

Dim col As New Collection
Set col = toCollection(RangeName(0))
Dim arr() As Variant
arr = toArray1D(col)
Set col = Nothing
``` &001
0
Advertisement
0
0
2018-04-08 02:00:48 +0000
Advertisement

Het antwoord staat in het geaccepteerde antwoord in (zonder het ReDim-probleem): https://stackoverflow.com/questions/12663879/adding-values-to-variable-array-vba

In samenvatting:

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
Advertisement

Gerelateerde vragen

6
13
9
10
6
Advertisement