Excel - 将多个列合并为一列

时间:2010-06-04 20:40:48

标签: excel merge excel-vba vba

我有多个列表在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

需要跳过每列的第一行。

5 个答案:

答案 0 :(得分:16)

试试这个。单击您的数据范围中的任意位置,然后使用此宏:

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

答案 1 :(得分:9)

您可以在不使用宏的情况下组合列。在公式栏中键入以下函数:

<强> = IF(ROW()&LT = COUNTA(A:A),INDEX(A:A,ROW()),IF(ROW()&LT = COUNTA(A:B),INDEX( B:B,ROW() - COUNTA(A:A)),IF(ROW()&GT; COUNTA(A:C),&#34;&#34;,INDEX(C:C,ROW() - COUNTA (A:B)))))

该语句使用3个IF函数,因为它需要组合3列:

  • 对于A列,该函数将单元格的行号与A列中非空的单元格总数进行比较。如果结果为true,则该函数返回位于row()的A列中的单元格的值。如果结果为false,则函数将移至下一个IF语句。
  • 对于B列,该函数将单元格的行号与A:B范围内非空的单元格总数进行比较。如果结果为true,则该函数返回B列中非空的第一个单元格的值。如果为false,则该函数将继续执行下一个IF语句。
  • 对于C列,该函数将单元格的行号与A:C范围内非空的单元格总数进行比较。如果结果为true,则该函数返回一个空白单元格,并且不再进行任何计算。如果为false,则该函数返回第C列中非空的第一个单元格的值。

答案 2 :(得分:2)

我在这里创建了一个示例电子表格,其中介绍了如何使用简单的Excel公式执行此操作,并且不使用宏(您需要自行调整以摆脱第一行,但是一旦您弄清楚这应该很容易我的示例电子表格如何工作):

https://docs.google.com/a/umich.edu/spreadsheet/ccc?key=0AuSyDFZlcRtHdGJOSnFwREotRzFfM28tWElpZ1FaR2c#gid=0

答案 3 :(得分:1)

不确定这是否完全有帮助,但我遇到了需要“智能”合并的问题。我有两个专栏,A&amp; 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

答案 4 :(得分:1)

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