【问题标题】:How to Consolidate Data from Multiple Excel Columns All into One Column如何将多个 Excel 列中的数据全部合并为一列
【发布时间】:2011-05-27 16:26:06
【问题描述】:

假设我有一个 4 列数据和每列 20,000 行数据的 Excel 表。

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

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

谢谢!

【问题讨论】:

  • 为什么不直接复制/粘贴?如果您需要在多个工作表中制作,只需记录复制/粘贴的宏
  • 因为我最多可以有 30 或 40 列,所有列都有 20 到 70,000 个条目。复制和粘贴变得相当乏味...必须找到每列数据停止的位置,单击它,滚动回顶部,全选,复制,回到 A 列的底部,粘贴...重复 30 或 40 次。
  • 我不确定您执行此操作的频率 - 但我将文件导出为 CSV 并使用 Notepad++ 之类的程序查找所有逗号并将其替换为 \n 换行符(或您的 CSV 用于结束行的任何字符)。保存文件并在 excel 中重新打开,它应该将所有数据放在一列中。
  • 有这么多数据,我很想知道宏需要多长时间才能完成这项工作。您能否报告运行宏需要多长时间?

标签: excel vba


【解决方案1】:

保存您的工作簿。如果这段代码没有达到你想要的效果,唯一的返回方法是关闭而不保存并重新打开。

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

按 Alt+F11 打开 VBE

按 Control+R 查看项目资源管理器

导航到工作簿的项目并选择插入 - 模块

将此代码粘贴到代码窗格中

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 运行代码

【讨论】:

  • 请注意,当我尝试选择完整的列时,它不起作用。不过,在数据周围选择一个框效果非常好!
  • 它专门阻止您处理整个列。如果我只是将选择减少到 UsedRange 会更好,但我输入了If Selection.Count &lt;= Selection.Parent.Rows.Count Then,这样它就不会尝试在一百万个东西上运行。
  • 很好的答案。使用方便。同样要呼应 Arth,您不能只选择全部,您需要专门选择一系列数据才能使其工作。干杯迪克!
【解决方案2】:

遵循的最佳且简单的解决方案:

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

复制单元格范围(多列)

打开记事本++

粘贴选定的单元格范围

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

所有的多列都属于一列

现在复制相同的内容并粘贴到 excel 中

对于那些不想在 VBA 中浪费时间编码的人来说,简单而有效的解决方案

【讨论】:

    【解决方案3】:

    以下是使用一些简单的 Excel 公式的方法,不需要花哨的 VBA。诀窍是使用偏移公式。请查看此示例电子表格:

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

    【讨论】:

    • 效果很好。酷。
    【解决方案4】:

    您没有提及您使用的是 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

    无论您选择使用什么来将数据移入/移出 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 社区非常活跃,可以帮助解决您可能遇到的所有问题。

    祝你好运!

    【讨论】:

      【解决方案5】:

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

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

      源代码和其他细节是here。 如果这不适合和/或您想构建我的解决方案,您可以fork 我的函数(Python)或使用其他支持的脚本语言(RubyRJS 等... )。

      【讨论】:

        【解决方案6】:

        公式

        =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 行不再是真正的限制。

        【讨论】:

          猜你喜欢
          • 2011-02-27
          • 2017-05-13
          • 1970-01-01
          • 2016-08-31
          • 1970-01-01
          • 2019-05-27
          • 2018-05-25
          • 1970-01-01
          相关资源
          最近更新 更多