2014-05-25 2 views
0

나는이 코드를 이미 가지고있는 배열을 가지고 있습니다. 이제 다음을 수행 할 수 있도록 코드를 수정하고 싶습니다. 내가 가지고있는 코드는 이조 나는 단지 캔트 작업을 수행 언급 한 바와 같이, 예를 들어중복 된 vba 배열이 중첩 된 방식으로

원래 배열

1 5 
2 7 
3 11 
4 15 

1 1 2 2 3 3 4 4 
5 5 7 7 11 11 15 15 

가되도록

배열의 각 항목은 중복됩니다 복제 방법

Public Sub DynamicTranspose1() 
Dim I As Variant 
Dim J As Variant 
Dim transArray() As Variant 
Dim numRows As Integer 
Dim numColumns As Integer 
'—————————————- 
'Get rows for dynamic array. 
'—————————————- 
Do 
numRows = I 
I = I + 1 

Loop Until Cells(I, "A").Value = "" 
'———————————————- 
'Get columns for dynamic array. 
'———————————————- 
I = 0 
Do 
numColumns = I 
I = I + 1 
Loop Until Cells(1, Chr(I + 64)).Value = "" 
ReDim transArray(numRows - 1, numColumns - 1) 
'—————————————————- 
'Copy data from worksheet to array. 
'—————————————————- 
For I = 1 To numColumns 
For J = 1 To numRows 
transArray(J - 1, I - 1) = Cells(J, Chr(I + 64)).Value 
Next J 
Next I 
maxcol = Split(Cells(1, numColumns).Address, "$")(1) 
Range("A1:" & maxcol & numRows).ClearContents 
'——————————————————————— 
'Copy data from array to worksheet transposed. 
'——————————————————————— 
For I = 1 To numColumns 
For J = 1 To numRows 
Cells(I, Chr(J + 64)).Value = transArray(J - 1, I - 1) 
Next J 
Next I 
End Sub 

누군가가 도움을 줄 수 있습니까?

+0

왜 이렇게해야하는지 궁금합니다. 배열을 두 번 반복하거나 한 번 반복하는 것과 같은 더 나은 대안이있을 수 있지만 동일한 배열 요소에 변수 쌍을 설정하는 것 같습니다. –

+0

루핑은 매우 큰 데이터 세트만큼 길어질 것이며, 지금까지는 조바꿈이 발생하는 가장 빠른 방법입니다. – Ingram

+0

또한 검색 할 특정 필드를 선택할 것입니다. – Ingram

답변

0

왜 이렇게되지 않습니까? 한 번에 시트 하나에/개별 셀에서 데이터 읽기/쓰기하는 세포를 통해 반복하지 않는 -

Dim arrIn As Variant 
Dim arrOut As Variant 
Dim i As Long, j As Long 
'Get data from sheet 
arrIn = Range("B9:C12").Value 'or wherever your data is located 
'Duplicate the data & transpose 
ReDim arrOut(1 To UBound(arrIn, 2), 1 To 2 * UBound(arrIn, 1)) 
For i = 1 To UBound(arrIn, 1) 
    For j = 1 To UBound(arrIn, 2) 
     arrOut(j, (2 * i) - 1) = arrIn(i, j) 
     arrOut(j, 2 * i) = arrIn(i, j) 
    Next j 
Next i 
'now slap it back onto the sheet 
Range("G17").Resize(UBound(arrIn, 2), 2 * UBound(arrIn, 1)).Value = arrOut 

루핑은 오래 걸리지 않을 않습니다. 이것은 당신이하는 일이며, 실제로는 오래 걸릴 것입니다.

위 코드에서 내가 그렇게하지 않는다는 것을 알게 될 것입니다. 한 번에 전체 배열을 읽고 끝까지 한꺼번에 쓰십시오. Range 개체의 .Value 속성을 사용하면이 작업을 수행 할 수 있습니다.

일단 배열을 읽어 들이면 루프가 끝나면 빨리 루프됩니다.

관련 문제