【问题标题】:Excel - Combine multiple columns into one columnExcel - 将多列合并为一列
【发布时间】: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

每列的第一行需要跳过。

【问题讨论】:

    标签: merge excel vba


    【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-31
            • 2020-05-01
            • 2016-10-24
            • 2020-04-14
            • 1970-01-01
            相关资源
            最近更新 更多