source

배열로 컬렉션 채우기

manysource 2023. 8. 23. 21:53

배열로 컬렉션 채우기

Dim A As Collection
Set A = New Collection

Dim Arr2(15, 5)
Arr2(1,1) = 0
' ...

A.Add (Arr2)

액세스하는 방법Arr2통해.A예를 들어 다음 작업을 수행합니다.

A.Item(1) (1,1) = 15

그래서 위의 것들은 집합 안에 있는 첫 번째 2차원 배열의 첫 번째 요소를 바꿀 것입니다...

음... 구문은 VBA가 내 앞에 없어도 충분히 합법적으로 보입니다.당신의 문제는 코드가 오류를 발생시키지 않고 "컴파일"하고 실행되지만 컬렉션의 배열은 변경되지 않는다는 것이 맞습니까?만약 그렇다면, 저는 그것이 당신의 A 때문이라고 생각합니다.항목(1)이 컬렉션에 저장한 배열의 복사본을 반환하고 있을 수 있습니다.그런 다음 선택한 요소에 액세스하고 수정하는 것은 문제가 없지만 잘못된 배열 인스턴스이기 때문에 원하는 효과를 내지 못합니다.

일반적으로 VBA 컬렉션은 개체를 저장할 때 가장 잘 작동합니다.그러면 그들은 레퍼런스를 저장하기 때문에 당신이 원하는 대로 작동할 것입니다.값을 저장하는 데는 문제가 없지만 항상 복사합니다. 배열 변형과 같은 "큰" 값도 복사합니다. 저장된 배열의 내용을 변형할 수 없습니다.

이 대답은 기본 COM 내용을 더 잘 아는 사람이 개입하기 전까지는 단지 추측일 뿐입니다.조엘 스폴스키 호출?

편집: Excel VBA에서 사용해 본 결과, 제 생각이 맞는 것 같습니다.배열 변형을 컬렉션에 넣으면 복사본이 생성되고 하나를 꺼내는 것도 마찬가지입니다.따라서 실제로 요청한 내용을 코드화할 수 있는 직접적인 방법은 없는 것 같습니다.

실제로 원하는 것은 3D 배열처럼 보이지만, 첫 번째 차원에 컬렉션을 사용하려고 시도했다는 사실은 해당 차원에서 컬렉션의 크기를 변경할 수 있음을 의미합니다.VBA에서는 배열의 마지막 차원 크기만 변경할 수 있습니다(도움말의 "리딤 보존" 참조).2-D 어레이를 1-D 어레이 내에 배치하여 크기를 변경할 수 있습니다.

ReDim a(5)
Dim b(2, 2)
a(2) = b
a(2)(1, 1) = 42
ReDim Preserve a(6)

이 경우 a는 Dim이 아닌 ReDim으로 선언됩니다.

마지막으로, 여러분이 하려는 것이 무엇이든 간에 다른 접근법이 더 나을 수도 있습니다.확장 가능하고 가변적인 3-D 어레이는 복잡하며 오류가 발생하기 쉽습니다.

@combolle이 맞습니다.아래 코드를 실행하여 Arr2와 x의 값(Quick Watch는 Shift-F9)을 검사하면 서로 다르다는 것을 알 수 있습니다.

Dim A As Collection
Set A = New Collection
Dim Arr2(15, 5)

Arr2(1, 1) = 99

' ...

A.Add (Arr2) ' adds a copy of Arr2 to teh collection

Arr2(1, 1) = 11  ' this alters the value in Arr2, but not the copy in the collection

Dim x As Variant

x = A.Item(1)
x(1, 1) = 15  ' this does not alter Arr2

VBA가 컬렉션에 할당할 때 어레이의 복사본을 만드는 것이 아닐까요?VB.net 에서는 이 작업을 수행하지 않습니다.이 코드 뒤에 a(3,3)는 vba에서 20이고 vb.net 에서 5입니다.

Dim c As New Collection
Dim a(10, 10) As Integer

a(3, 3) = 20
c.Add(a)
c(1)(3, 3) = 5

저는 최근에 이 정확한 문제를 겪었습니다.문제의 항목 배열로 배열을 채우고, 이 배열을 변경하고, 컬렉션에서 항목 배열을 삭제한 다음, 변경된 배열을 컬렉션에 추가하여 해결했습니다.예쁘지는 않지만 효과가 있었어요.. 다른 방법을 찾을 수가 없어요.

컬렉션에 어레이에 대한 참조가 아닌 어레이의 복사본을 가져오려면 array.clone 메서드를 사용합니다.

Dim myCollection As New Collection
Dim myDates() as Date
Dim i As Integer

Do
   i = 0
   Array.Resize(myDates, 0)
   Do
       Array.Resize(myDates, i + 1)
       myDates(i) = Now
       ...
       i += 1
   Loop
   myCollection.Add(myDates.Clone)
Loop

마지막으로 myCollection에는 myDates()의 누적 컬렉션이 포함됩니다.

언급URL : https://stackoverflow.com/questions/1402876/populating-collection-with-arrays