如何将多个Excel列中的数据合并为一列

时间:2010-12-18 21:21:20

标签: excel vba

假设我有一张包含4列数据的Excel表格。每列20,000行数据。

获得它的最有效方法是什么,以便将所有数据合并到一列中(IE-A列中的80,000行数据,而不是跨4列分布的20,000行数据)。

此外,如何实施该解决方案。我的意思是,如果您的解决方案不是“公式”而是VBA,我该如何实施该解决方案?

谢谢!

6 个答案:

答案 0 :(得分:16)

保存您的工作簿。如果此代码不能满足您的要求,那么返回的唯一方法就是关闭而不保存并重新打开。

在一列中选择要列出的数据。必须是连续的列。可能包含空白单元格。

按Alt + F11打开VBE

按Control + R查看Project Explorer

导航到工作簿的项目,然后选择“插入 - 模块”

将此代码粘贴到代码窗格

Sub MakeOneColumn()

    Dim vaCells As Variant
    Dim vOutput() As Variant
    Dim i As Long, j As Long
    Dim lRow As Long

    If TypeName(Selection) = "Range" Then
        If Selection.Count > 1 Then
            If Selection.Count <= Selection.Parent.Rows.Count Then
                vaCells = Selection.Value

                ReDim vOutput(1 To UBound(vaCells, 1) * UBound(vaCells, 2), 1 To 1)

                For j = LBound(vaCells, 2) To UBound(vaCells, 2)
                    For i = LBound(vaCells, 1) To UBound(vaCells, 1)
                        If Len(vaCells(i, j)) > 0 Then
                            lRow = lRow + 1
                            vOutput(lRow, 1) = vaCells(i, j)
                        End If
                    Next i
                Next j

                Selection.ClearContents
                Selection.Cells(1).Resize(lRow).Value = vOutput
            End If
        End If
    End If

End Sub

按F5运行代码

答案 1 :(得分:8)

最佳和简单的解决方案:

选择要复制到单列的列的范围

复制单元格范围(多列)

打开Notepad ++

粘贴选定的单元格范围

按Ctrl + H,将\ t替换为\ n,然后点击全部替换

所有多列都属于一列

现在复制相同并粘贴excel

简单有效的解决方案,适合那些不想在VBA中浪费时间编码的人

答案 2 :(得分:5)

以下是使用一些简单的Excel公式进行操作的方法,而不需要花哨的VBA。诀窍是使用OFFSET公式。请参阅此示例电子表格:

https://docs.google.com/spreadsheet/ccc?key=0AuSyDFZlcRtHdGJOSnFwREotRzFfM28tWElpZ1FaR2c&usp=sharing#gid=0

答案 3 :(得分:0)

您没有提及是否使用的是Excel 2003或2007,但是您可能会遇到Excel 2003中的行数为65,536的问题。如果您使用的是2007,则限制为1,048,576。

另外,我可以问你的最终目标是什么?如果您需要对数据执行许多统计计算,我建议您从Excel环境中移出更直接适合数据操作和分析的内容,例如R

将R连接到Excel有多种选择,包括

  1. RExcel
  2. RODBC
  3. Other options in the R manual
  4. 无论您选择使用什么来将数据移入/移出R,从宽文件格式转换为长格式的代码都非常简单。我喜欢reshape package中的melt()功能。该代码看起来像:

    library(reshape)
    #Fake data, 4 columns, 20k rows
    df <- data.frame(foo = rnorm(20000)
        , bar = rlnorm(20000)
        , fee = rnorm(20000)
        , fie = rlnorm(20000)
    )
    #Create new object with 1 column, 80k rows
    df.m <- melt(df)
    

    从那里,您可以执行任意数量的统计或绘图操作。如果您使用上面的RExcel插件,您可以启动所有这些并在Excel中运行它。 R社区非常活跃,可以帮助解决您可能遇到的任何和所有问题。

    祝你好运!

答案 4 :(得分:0)

看看Blockspring - 您确实需要安装插件,但它只是您调用的另一个函数:

=BLOCKSPRING("twodee-array-reduce","input_array",D5:F7)

源代码和其他详细信息为here。 如果这不适合和/或您想要构建我的解决方案,您可以fork我的函数(Python)或使用其他支持的脚本语言(RubyR,{{ 1}}等等......)。

答案 5 :(得分:0)

公式

=OFFSET(Sheet1!$A$1,MOD(ROW()-1,COUNT(Sheet1!$A$1:$A$20000)),
    (ROW()-1)/COUNT(Sheet1!$A$1:$A$20000))
放置到第二个工作簿的每个单元格中的

将从源表单中检索相应的单元格。没有宏,只需从一张纸复制到另一张,即可重新格式化结果。

您需要修改COUNT函数中的范围以匹配源表中的最大行数。根据需要调整列标题。

如果对于空单元格需要0以外的其他值,则可能更喜欢包含条件。

重新格式化数据的脚本可能更有效,但在现代Excel工作簿中,20k行不再是真正的限制。