Додавання елемента до кінця масиву


14

Я хотів би додати значення до кінця масиву VBA. Як я можу це зробити? Мені не вдалося знайти простий приклад в Інтернеті. Ось псевдокод, який показує, що я хотів би зробити.

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

Чи є ідея додавати значення в кінець наявного масиву? Або це як ваш приклад, коли ви просто хочете завантажити діапазон у масив? Якщо останні, чому б не скористатись однолінійкою arr = Range.Value?
Excellll

Відповіді:


10

Спробуйте це [РЕГІСТОВАНО]:

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

Дякую, але, на жаль, це не працює з вимогами, UBound(arr)які arrініціалізуються з певним розміром, наприклад, Dim arr(1) As Variantале потім пізніше ReDim Preserveце збій і каже, що масив вже розмірний? іншими словами ви не можете переробити масив у VBA?
megloff

Згідно з повідомленням msdn.microsoft.com/library/w8k3cys2.aspx ви можете ...
duDE

Добре, що приклад з MSDN також не працює в excel vba. така ж помилка, скаржиться, що масив вже розмірний
megloff

Виглядає так, що я повинен використовувати замість масиву a Collectionі перетворювати його після цього в масив. Будь-які інші пропозиції?
megloff

2
Дякую, але це все ще не поступається таким чином, оскільки, як було сказано раніше, UBound(arr)потрібен вже розмірний масив. Ну виглядає так, що мені доведеться замість цього використовувати колекцію. Все одно дякую
megloff

9

Я вирішив проблему за допомогою колекції та копіював її в масив.

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
Якщо ви збираєтеся використовувати колекцію, ви також можете використовувати об'єкт словника. `Set col = CreateObject (" Scripting.Dictionary ")` Тоді ви можете вивести Ключі безпосередньо як масив і пропустити додану функцію: `arr = col.keys` <= масив
B Hart

3

Так я це роблю, використовуючи змінну Variant (масив):

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

Або якщо вам дійсно потрібен масив Variants (наприклад, для переходу до властивості типу Shapes.Range), ви можете це зробити так:

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

дякую, використовуючи ReDim arr (0 до 0), а потім виділяючи наступний елемент, який працював на мене
Василь Сурду

1

Якщо діапазон - це один вектор, і якщо у стовпці кількість рядків менше 16 384, ви можете використовувати такий код:

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

Дякую. Виконайте те саме з двома функціями, якщо це може допомогти іншим нобівам, як я:

Колекція

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 масив:

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

Використання

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.