excel - 从单列到 3X8 表

标签 excel vba algorithm

我在单列中有一个排序的名称列表。我想在打印之前将名称转换为 3X8 表格(打印单列会使用太多纸张)。这是Excel。我会一个一个地复制名字并粘贴到一张空白纸上。

以数字为例,结果顺序应该是这样的:

1   9   17
2   10  18
3   11  19
4   12  20
5   13  21
6   14  22
7   15  23
8   16  24
25  33  41
26  34  42
27  35  43
........

可能得到一个通用的答案(n x m 表)?

下面是我得到的。很接近但不太正确。

last_row = ThisWorkbook.Sheets(1).Cells(20000,1).End(xlUp).Row

For i = 1 To last_row/24 +1 Step 1 
    For k = 1 To 3 Step 1
        For j = 1 To members_per_column Step 1
            ThisWorkbook.Sheets(1).Cells( i + j + (k - 1) * 8 + (i - 1) * 16 + 1, _
                name_column).Copy
            Worksheets(destination_page).Cells( i + j - 1, (k - 1) +1).PasteSpecial _       
                Paste:=xlPasteValues
        Next j
    Next k
Next i

最佳答案

你已经很接近了。我将代码包装到一个函数中,这样您就可以轻松地在任何矩阵大小上重复使用它:

Option Explicit

Public Sub TransformIntoBlocks(ByVal MatrixRows As Long, ByVal MatrixColumns As Long, ByVal SourceRange As Range, ByVal OutputStartRange As Range)
    Dim BlockStartRow As Long
    BlockStartRow = 1

    Dim iRowSource As Long
    iRowSource = 1

    Dim AmountOfBlocks As Long
    AmountOfBlocks = WorksheetFunction.RoundUp(SourceRange.Rows.Count / (MatrixRows * MatrixColumns), 0)

    Dim iBlock As Long
    For iBlock = 1 To AmountOfBlocks
        Dim iCol As Long
        For iCol = 1 To MatrixColumns
            Dim iRow As Long
            For iRow = BlockStartRow To BlockStartRow + MatrixRows - 1
                OutputStartRange.Offset(iRow - 1, iCol - 1).Value = SourceRange(iRowSource, 1).Value
                iRowSource = iRowSource + 1
            Next iRow
        Next iCol
        BlockStartRow = BlockStartRow + MatrixRows
    Next iBlock
End Sub


Sub test()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    TransformIntoBlocks MatrixRows:=8, MatrixColumns:=3, SourceRange:=ws.Range("A1", ws.Cells(ws.Rows.Count, "A").End(xlUp)), OutputStartRange:=Tabelle2.Range("C1")
End Sub

关于excel - 从单列到 3X8 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57378732/

相关文章:

algorithm - 合并两个splay树

excel - 我可以修改此宏以仅在一列上运行吗?

arrays - 查找数组元素中的最大差异

algorithm - 动态算法查找数组中 "accessible"数字的乘积的最大和

java - openxml和Excel 15位数字限制

arrays - 来自一维数组的唯一值,无需迭代

vba - Excel VBA : Can I query external excel without opening the target file?

excel - AVERAGEIFS 不包括包含指定文本的单元格

python - 操作系统错误: No suitable library found for xls

excel - 将包含换行符的文本文件导入到 Excel 中