Excel - 通过空单元格将长列拆分为多列

Excel - 通过空单元格将长列拆分为多列

所以我有数据,一旦导入到 Excel 中如下所示:

1
2
3
4

A
B
C
D

!
@
#
$

我希望数据看起来像这样:

1 A !
2 B @
3 C #
4 D $

所有数据都在一列中,每组新数据都以一个空单元格为偏移。我想要做的就是能够将一列拆分为多列,并在每个空单元格处创建一个新列。每次我记录数据时,每组中的数据条目数量相同,但它们的类型不同,并且在记录之间每组中的条目数量可能不同。基本上,我想要发生的就是 excel 沿着列向下移动,当它找到一个空单元格时,它会将所有剩余数据复制到下一列,然后查找下一个空单元格,此时它将执行相同的操作,直到一行中有 2 个空单元格。

搜索如何做到这一点非常烦人,因为我不断获得文本到列的结果,这不是我想要的。

提前致谢。

答案1

我建议在将数据导入 Excel 之前对其进行预处理。

不过,我在 VBA 中创建了可以执行您想要的操作的过程:

安装宏

打开 Excel -> Alt+F11 -> 插入 -> 模块 -> 粘贴以下代码 -> Ctrl+S -> 从下拉列表中选择“Excel 启用宏的工作簿 (*.xlsm)”

Sub ToManyColumns()
    Dim firstCellRow As Long
    firstCellRow = 1              'change this if you don't want to start at A1
    Dim firstCellColumn As Long
    firstCellColumn = 1           'change this if you don't want to start at A1
    
    Application.ScreenUpdating = False
    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    Dim column As Long
    column = firstCellColumn
    Dim startIndex As Long
    Dim endIndex As Long
    Dim lastRow As Long
    lastRow = firstCellRow
    
    Do While True
        'find the range to copy
        startIndex = ActiveCell.row
        Do While ActiveCell.Value <> ""
            endIndex = ActiveCell.row
            ActiveCell.Offset(1).Activate
        Loop
        
        lastRow = ActiveCell.row
        
        Range(Cells(startIndex, firstCellColumn), Cells(endIndex, firstCellColumn)).Select
        Selection.Copy
        Cells(firstCellRow, column).Select
        Selection.PasteSpecial Paste:=xlPasteValues
        
        'get back to last rowIndex
        Cells(lastRow, firstCellColumn).Activate
        ActiveCell.Offset(1).Activate
        
        If ActiveCell.Value = "" Then Exit Do
        
        column = column + 1
    Loop
    
    'cleanUp -------------------------------------------
    Dim deleteFrom As Long
    Dim deleteTo As Long
    deleteTo = ActiveCell.row
    
    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    Do While ActiveCell.Value <> ""
        ActiveCell.Offset(1).Activate
    Loop
    deleteFrom = ActiveCell.row
    
    Range(Cells(deleteFrom, firstCellColumn), Cells(deleteTo, firstCellColumn)).Select
    Selection.ClearContents
    
    ActiveSheet.Cells(firstCellRow, firstCellColumn).Activate
    'cleanUp -------------------------------------------
    
    Application.ScreenUpdating = True
End Sub

运行宏:

  1. 确保您位于所需的工作表中!然后单击工作表中的任意位置!(因为此宏在已激活的工作表中运行)
  2. Alt+F11 -> 单击代码中的任意位置 -> 按 F5

您还可以在工作表中创建一个按钮并为其分配宏 - 它更加用户友好,您不必检查是否在正确的工作表中。

笔记

如果您不想让宏从单元格 A1 开始(例如:从不同的列开始),则更改第 3 行和第 5 行的数字。

为此,最好预处理数据而不是使用宏......

答案2

假设第一个数据在 Sheet1 的 A1 中。输入:

B1 ---> 1
C1 ---> 1

然后

B2 ---> =IF(A2="",0,B1+1)
C2 ---> =IF(B2=0,C1+1,C1)

并拖动直到数据结束。在 Sheet2 的 A1 单元格中输入:

=IFERROR(INDEX(Sheet1!$A:$A,MATCH(1,INDEX((CELL("row",Sheet2!A1)=Sheet1!$B:$B)*(CELL("col",Sheet2!A1)=Sheet1!$C:$C),0,1),0)),"")

然后拖动直到 C6。解决了。

希望能帮助到你。 (:

p/s : 我的参考是这里

相关内容