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 錯誤通常是由於引用了(在該時間點)不存在的物件(行、儲存格、列、範圍等)。

要開始診斷,請在出現錯誤的行上放置一個斷點,然後逐步檢查 desRow、srcColumn、srcRow、rng 和 count 的值(透過 Watches)。在循環的每次迭代中檢查它們,並確保它們引用有效的物件(當時實際存在的)。

答案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

相關內容