Excel - 将多列合并为一列
Posted
技术标签:
【中文标题】Excel - 将多列合并为一列【英文标题】:Excel - Combine multiple columns into one column 【发布时间】:2011-02-27 23:47:54 【问题描述】:我有多个列表,它们位于 excel 的不同列中。我需要做的就是将这些数据列合并到一个大列中。我不在乎是否有重复的条目,但是我希望它跳过每列的第 1 行。
另外如果ROW1有1-12月的表头,列的长度不一样,需要合并成一个大列怎么办?
ROW1| 1 2 3
ROW2| A D G
ROW3| B E H
ROW4| C F I
应该合并成
A
B
C
D
E
F
G
H
I
每列的第一行需要跳过。
【问题讨论】:
【参考方案1】:试试这个。单击数据范围内的任意位置,然后使用此宏:
Sub CombineColumns()
Dim rng As Range
Dim iCol As Integer
Dim lastCell As Integer
Set rng = ActiveCell.CurrentRegion
lastCell = rng.Columns(1).Rows.Count + 1
For iCol = 2 To rng.Columns.Count
Range(Cells(1, iCol), Cells(rng.Columns(iCol).Rows.Count, iCol)).Cut
ActiveSheet.Paste Destination:=Cells(lastCell, 1)
lastCell = lastCell + rng.Columns(iCol).Rows.Count
Next iCol
End Sub
【讨论】:
这是一段很棒的代码。要记住的一件事是 Integer 限制为 32768,所以我使用 Long 来存储 iCol 和 lastCell。 谢谢。我同意 long 是更稳健的选择。 你是最棒的【参考方案2】:您可以在不使用宏的情况下组合列。在公式栏中键入以下函数:
=IF(ROW()<=COUNTA(A:A),INDEX(A:A,ROW()),IF(ROW()<=COUNTA(A:B),INDEX(B:B,ROW()-COUNTA(A:A)),IF(ROW()>COUNTA(A:C),"",INDEX(C:C,ROW()-COUNTA(A:B)))))
该语句使用了 3 个 IF 函数,因为它需要合并 3 列:
对于 A 列,该函数将单元格的行号与 A 列中非空的单元格总数进行比较。如果结果为真,则函数返回位于 row() 的列 A 中的单元格的值。如果结果为假,则函数继续执行下一个 IF 语句。 对于 B 列,该函数将单元格的行号与 A:B 范围内不为空的单元格总数进行比较。如果结果为真,则函数返回 B 列中第一个非空单元格的值。如果为假,则函数继续执行下一个 IF 语句。 对于 C 列,该函数将单元格的行号与 A:C 范围内非空的单元格总数进行比较。如果结果为真,该函数将返回一个空白单元格并且不再进行任何计算。如果为 false,则函数返回 C 列中第一个非空单元格的值。【讨论】:
【参考方案3】:我在这里创建了一个示例电子表格,说明如何使用简单的 Excel 公式执行此操作,并且不使用宏(您需要自行调整以摆脱第一行,但一旦您弄清楚这应该很容易我的示例电子表格是如何工作的):
https://docs.google.com/a/umich.edu/spreadsheet/ccc?key=0AuSyDFZlcRtHdGJOSnFwREotRzFfM28tWElpZ1FaR2c#gid=0
【讨论】:
【参考方案4】:不确定这是否完全有帮助,但我遇到了一个需要“智能”合并的问题。我有两列,A 和 B。只有当 A 为空白时,我才想将 B 移过来。见下文。它基于一个选择范围,您可以使用它来偏移第一行。
Private Sub MergeProjectNameColumns()
Dim rngRowCount As Integer
Dim i As Integer
'Loop through column C and simply copy the text over to B if it is not blank
rngRowCount = Range(dataRange).Rows.Count
ActiveCell.Offset(0, 0).Select
ActiveCell.Offset(0, 2).Select
For i = 1 To rngRowCount
If (Len(RTrim(ActiveCell.Value)) > 0) Then
Dim currentValue As String
currentValue = ActiveCell.Value
ActiveCell.Offset(0, -1) = currentValue
End If
ActiveCell.Offset(1, 0).Select
Next i
'Now delete the unused column
Columns("C").Select
selection.Delete Shift:=xlToLeft
End Sub
【讨论】:
【参考方案5】:Function Concat(myRange As Range, Optional myDelimiter As String) As String
Dim r As Range
Application.Volatile
For Each r In myRange
If Len(r.Text) Then
Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text
End If
Next
End Function
【讨论】:
以上是关于Excel - 将多列合并为一列的主要内容,如果未能解决你的问题,请参考以下文章