Dizinin sonuna bir öğe ekleme


10

Bir VBA dizisinin sonuna bir değer eklemek istiyorum. Bunu nasıl yapabilirim? Online basit bir örnek bulamadım. İşte ne yapmak istediğimi gösteren bazı sahte kod.

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

Mevcut bir dizinin sonuna değer ekleme fikri midir? Yoksa bir diziye bir dizi yüklemek istediğiniz örnek olarak mı? İkincisi ise, neden bir astar kullanılmıyor arr = Range.Value?
Excellll

Yanıtlar:


8

Bunu deneyin [EDİTDİR]:

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

Teşekkürler ama ne yazık ki bu işe yaramazsa UBound(arr) bunu gerektirir arr örneğin, bir miktar boyutlandırma ile başlatılmıştır. Dim arr(1) As Variant ama sonra ReDim Preserve başarısız oluyor ve dizinin zaten boyutlandırıldığını söylüyor? başka bir deyişle, VBA'da bir diziyi tekrar edemezsiniz?
megloff


Msdn'den gelen örnek excel vba'da da çalışmıyor. Aynı hata, bu dizinin zaten boyutlandırıldığından şikayet ediyor
megloff

Bir dizi yerine kullanmam gerekiyor gibi görünüyor Collection ve daha sonra bir diziye dönüştürün. Başka bir önerin var mı?
megloff

2
Teşekkürler ama yine de daha önce belirtildiği gibi hala bu şekilde endişelenmiyor. UBound(arr) zaten boyutlandırılmış bir dizi gerektirir. Öyle görünüyor ki bunun yerine bir koleksiyon kullanmam gerekiyor. Yine de teşekkürler
megloff

5

Bir Koleksiyon kullanarak sorunu çözdüm ve daha sonra bir diziye kopyaladım.

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
Bir Koleksiyon kullanacaksanız, bir Sözlük Nesnesi de kullanabilirsiniz. `Set col = CreateObject (" Scripting.Dictionary ")` Sonra Anahtarları doğrudan bir dizi olarak çıkarabilir ve eklediğiniz işlevi atlayabilirsiniz: `arr = col.keys` & lt; = Array
B Hart

3

Variant (array) değişkeni kullanarak bunu şöyle yapıyorum:

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

Veya, gerçekten bir Varyantlar dizisine ihtiyacınız varsa (örneğin, Shapes.Range gibi bir özelliğe geçmek için), o zaman bunu yapabilirsiniz:

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

teşekkürler, ReDim arr (0 To 0) kullanarak ve sonra bir sonraki eleman tahsisi benim için çalıştı
Vasile Surdu

1

Aralığınız tek bir vektör ise ve bir sütundaysa satır sayısı 16,384'ten azsa, aşağıdaki kodu kullanabilirsiniz:

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

Teşekkürler. Aynı benim gibi diğer noobs yardımcı olabilir eğer 2 işlevi ile aynı yapmak:

Toplamak

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

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

kullanım

Dim col As New Collection
Set col = toCollection(RangeName(0))
Dim arr() As Variant
arr = toArray1D(col)
Set col = Nothing

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.