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 - 将多列合并为一列的主要内容,如果未能解决你的问题,请参考以下文章

将多列合并为一列

请问如何用一个函数将excel中多列数据变为一列。谢谢!

excel多列文字合并成一列的方法都有哪些步骤

r 将多列中的数据合并为一列

Dask - 将多列合并为一列

EXCEL把多列数据变成一行的函数