所以我有数据,一旦导入到 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
运行宏:
- 确保您位于所需的工作表中!然后单击工作表中的任意位置!(因为此宏在已激活的工作表中运行)
- 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 : 我的参考是这里。