2013-04-27 3 views
0

그래서 배열의 배열을 만들고 싶습니다. 그리고 내가 모은 것에서 들쭉날쭉 한 배열이 필요한 것입니다.VBA의 들쭉날쭉 한 배열

나는 정수의 제곱 nxn 행렬을 정의하는 배열 x (i, j)를가집니다. k를 반복 할 때마다이 배열 안의 두 정수 값을 교체하여 행렬 x (i, j)를 더 잘 시도합니다. k를 반복 할 때마다이 행렬 x (i, j)를 저장하는 배열을 생성해야합니다.

내가

1 2 3 
4 5 6 
7 8 9 

이 있으면 말을 명확하게 그리고 배열 내부의 두 요소를 교환하는 반복 수행 : I가 배열 내에서 이러한 배열을 저장할 수 있도록하려면

7 2 3 
4 5 6 
1 8 9 

을 언제든지 불러올 수 있습니다. 나는 여기에서 해결책을 시도했다.

Dim y() As Variant 'Declare as a variant to contain arrays 
ReDim y(1 To IterationLimit) 'This will be the jagged array 

For k = 1 To IterationLimit 
'Some code goes here for the swap 
    y(k) = x(i,j) 
next k 

이제 85 번째 반복을 원한다. 그 특정 시간 동안 행렬 x (i, j)를 끌어 올리려면 y (85) [또는 유사]를 입력 할 수 있기를 원합니다.

잘 설명해 주셨으면합니다. 어떤 도움을 주셔서 감사합니다, 나는 정말 이걸 붙어 있습니다.

편집 : 삭제 된 코드

+0

y을 검토 VBE의 지역 창을 사용하여 마지막으로

Dim y as Variant y = arrContainer(2) '# or any in bounds index could be used instead of "2"'

그리고 여러분은 여러분이'x (i, j)''i'와'j'는이 배열의 경계를 나타 냅니까? 또는'x'는 배열의 배열이고, 자식 배열 중 하나는 인덱스'(i, j)'로 식별됩니까? –

+0

i와 j는 경계를 나타냅니다. 그래서 위의 예제에서 나는 x (1 to 3, 1 to 3)이 될 것이라고 생각한다. – Matt

+0

위의 행렬에서 x (2,2)를 참조한다면, 좀 더 많은 정보를 얻을 수있다. 두 번째 행과 두 번째 열, 즉 5. 도움이되는지 아닌지 확실하지 않습니다. – Matt

답변

5

확인. 나는 단순히 배열을 y에 올바르게 지정하지 않았을 것이라고 생각합니다. I는 주석에서 설명한 바와 :

y(k) = x(i,j)는 I로 표시되는 값을 저장 ONLY이다/J는 x 배열 좌표. y(k) 그 시간에 전체 배열 x을 참조하기 위해서는

, 당신은 할 것 :

y(k) = x

을 그 여전히 작동하지 않는 경우, 아마도 다른 무언가가 잘못되었습니다. 여기에 baseArray이라는 2x2 (기본 0) 배열이 있는데, 일부 값으로 명시 적으로 채우는 예제가 있습니다. i = 0 to itLimit에서 반복하고 각 반복 내에서 배열의 항목을 반복하고 값에 2를 곱한 다음 배열 변수 tmpArray에 저장합니다. 값을 변환 한 후에는 arrContainer에 저장하고 다음 For i = 0 to itLimit 반복으로 진행합니다.

Sub FunWithArrays() 
Dim itLimit As Integer '## Iteration limit.' 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 
Dim baseArray(2, 2) As Variant '## an example array.' 

    '## Put some dummy data in this array.' 
    baseArray(0, 0) = 1 
    baseArray(0, 1) = 65 
    baseArray(0, 2) = 13 
    baseArray(1, 0) = 14 
    baseArray(1, 1) = 29 
    baseArray(1, 2) = 44 
    baseArray(2, 0) = 9 
    baseArray(2, 1) = 16 
    baseArray(2, 2) = 33 

Dim tmpArray(2, 2) As Variant '## This will temporarily hold values as we transform them.' 
Dim arrContainer() As Variant '## an array of arrays, to store the iteration arrays.' 

    itLimit = 2 '## set a max iteration.' 

    For i = 0 To itLimit 
     '## Transform the base array somehow' 
     For j = LBound(baseArray, 1) To UBound(baseArray, 1) 
      For k = LBound(baseArray, 2) To UBound(baseArray, 2) 
       tmpArray(j, k) = baseArray(j, k) * 2 
      Next 
     Next 
     ReDim Preserve arrContainer(i) 
     arrContainer(i) = tmpArray 
    Next 

    Dim y As Variant 
    '## Now, refer to a single iteration stored in the arrContainer variable: 

    y = arrContainer(2) 

End Sub 

첫 번째 스크린 샷에서 나는 Locals 창을 사용하여 변수와 그 내용을 검토합니다. 첫번째 반복 후 tmpArray 채워되었음을 확인하고 baseArray 동일한 크기이지만 값 내에 2

Screenshot after the first iteration

arrContainer 변수를 검토하여 승산 된 수, 우리는 그것을 볼 항목이 하나 뿐이며 그 항목은 위의 반복에서 만든 tmpArray과 같은 배열입니다.

Screenshot of arrContainer after the first iteration

마지막 반복 후, 우리는 arrContainer을 검토하고 (우리 For i to itLimit 루프 당 0 ~ 2) 3 항목이 포함되어 있음을 볼 수 있습니다. arrContainer 안에있는 각 배열은 위의 반복에서 생성 된 배열 중 하나와 같습니다.

Screenshot of arrContainer array of arrays after all iterations

우리는 지금처럼, 이러한 항목을 참조 할 수 있습니다 :

Final screenshot referring to a single array item within arrContainer

+0

@David Zemens 오 이런, 훌륭합니다! 노동 조합 지부 창문은 전에는 사용하지 않았다고 생각했지만 실제로 유용하다고 판명되었습니다. 그리고 셀로 출력하려면 셀 (20 + i, 20 + j) .Value = ArrContainer (80) (i, j) [i 및 j For 루프 내부]를 사용합니다. 한 가지 질문 만! ReDim Preserve의 목적은 무엇입니까? Preserve는 무엇을합니까? – Matt

+0

@Matt'ReDim'은 배열을 다시 선언하거나 크기를 조정할 수있게합니다. 'Preserve'는 기존 값을 보존합니다. 'ReDim arrContainer (3)'와'ReDim Preserve arrContainer (3)'의 차이점은 첫 번째 명령문은 상한 = 3 인 배열의 크기를 지정하지만 내용은 지우는 반면, 후자는 상한이 3 인 배열 인 반면, 그 내용을 보존합니다. –

+0

@Matt Further : 우리는 초기에 'arrContainer as Variant'의 크기를 제한하지 않았으므로'arrContainer (0) = "blah"'와 같은 명령문은 에러를 일으킬 것입니다. 각 반복,'ReDim Preserve'는 배열을 더 크게 만들고 (새로운 값을 수용하기 위해), 기존 내용을 보존합니다.올바른 크기의 배열을 생성하는'itLimit'을 설정 한 후'ReDim arrContainer (itLimit-1)'을 할 수 있습니다. 그러나 루프를 사용하여 작업 할 때 종종 크기가 미리 알려지지 않으므로 루프 내에서 'ReDim Preserve'를 선호합니다. –

관련 문제