VBA - 3열을 9열로 다시 포맷

VBA - 3열을 9열로 다시 포맷

내 데이터는 수직으로 매우 긴 형태로 보입니다.

#1, name1, number1
#2, name2, number2
#3, name3, number3
...
#2000, name2000, number2000

각 인쇄 페이지에 맞는 2~3개의 열 세트로 다시 포맷하고 싶습니다. 이 같은

#1, name1, number1    #5    #9
#2, name2, number2    #6    #10
#3, name3, number3    #7    #11
#4, name4, number4    #8    #12
end of page 1
#13    #17   #21
#14    #18   #22
#15    #19   #23
#16    #20   #24

등등.

이전에 VB 코드를 작성한 적이 없지만 이 작업을 수행하기 위해 찾은 일부 기존 코드를 조정하려고 하는데 오류가 발생했습니다. 각 페이지에 필요한 행 수를 세어보니 그 숫자는 36개입니다.

Sub joeycol()
Dim count As Integer
count = 1

Dim desRow As Long
desRow = 1
Dim desColumn As Long
desColumn = 1

Dim srcRow As Long
Dim endRow As Long
endRow = 577

Dim srcColumn As Long

Dim wks As Worksheet
Set wks = Worksheets.Add

Dim x As Long

For srcRow = 1 To endRow
    If count = 4 Then
        count = 1
        desRow = desRow - 36
    End If

    For srcColumn = 1 To 3
        x = srcColumn * count
        Cells(desRow, x) = rng.Cells(srcRow, srcColumn)
    Next
    count = count + 1
    desRow = desRow + 1
Next

서브 끝

바로 여기에 있는 이 줄은 계속 오류 1004를 발생시키며 오류 메시지는 나에게 어떤 단서도 제공하지 않습니다.

Cells(desRow, x) = rng.Cells(srcRow, srcColumn)

내가 했던 것처럼 반복하는 대신 범위를 복사하여 이 작업을 수행하는 더 나은 방법에 대한 답변을 여기에서 읽었지만 최대한 빨리 완료해야 하기 때문에 공부할 시간이 없으며 누구든지 이 문제를 조사하는 데 도움을 주시면 감사하겠습니다. .

매우 감사합니다.

답변1

1004 오류는 일반적으로 해당 시점에 존재하지 않는 개체(행, 셀, 열, 범위 등)를 참조하기 때문에 발생합니다.

진단을 시작하려면 오류가 발생한 줄에 중단점을 놓은 다음 (Watch를 통해) desRow, srcColumn, srcRow, rng 및 count에 대한 값을 확인하는 단계를 진행하세요. 루프가 반복될 때마다 이를 확인하고 유효한 객체(그 당시 실제로 존재했던 객체)를 참조하고 있는지 확인하십시오.

답변2

이렇게 하면 행 길이가 36개에 불과한 페이지의 열을 따라 페이지 나누기를 삽입하게 됩니다. 이는 페이지당 72개의 3열 항목이 있음을 의미합니다.

Sub test()
Dim wsOriginal As Worksheet
Set wsOriginal = ActiveSheet
Dim wsDest As Worksheet
Set wsDest = Worksheets.Add

Dim lastrow As Integer
lastrow = wsOriginal.Cells(Rows.count, "a").End(xlUp).Row
Dim numSections As Integer
numSections = lastrow / 36
Dim i As Integer
Dim j As Integer
Dim k As Integer
k = 0

For i = 1 To lastrow
    If i > 36 * (k + 1) Then
        k = k + 1
    End If
    For j = 1 To 3
        wsDest.Cells((i - (36 * k)), j + (k * 4)) = wsOriginal.Cells(i, j)
    Next
Next

Dim lastCol As Integer
lastCol = wsDest.Cells(1, Columns.count).End(xlToLeft).Column
Dim numPages As Integer
numPages = lastCol / 8

For Z = 1 To numPages
    wsDest.Columns(8 * Z).PageBreak = xlPageBreakManual

Next

End Sub

관련 정보