배열 끝에 요소 추가


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

Collection을 사용하여 문제를 해결하고 나중에 배열에 복사했습니다.

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`<= Array
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 To 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

고마워. 나와 같은 다른 멍청한 놈을 도울 수 있다면 2 가지 기능으로 동일하게 수행하십시오.

수집

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.