假设我有一张包含4列数据的Excel表格。每列20,000行数据。
获得它的最有效方法是什么,以便将所有数据合并到一列中(IE-A列中的80,000行数据,而不是跨4列分布的20,000行数据)。
此外,如何实施该解决方案。我的意思是,如果您的解决方案不是“公式”而是VBA,我该如何实施该解决方案?
谢谢!
答案 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公式。请参阅此示例电子表格:
答案 3 :(得分:0)
您没有提及是否使用的是Excel 2003或2007,但是您可能会遇到Excel 2003中的行数为65,536的问题。如果您使用的是2007,则限制为1,048,576。
另外,我可以问你的最终目标是什么?如果您需要对数据执行许多统计计算,我建议您从Excel环境中移出更直接适合数据操作和分析的内容,例如R。
将R连接到Excel有多种选择,包括
无论您选择使用什么来将数据移入/移出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)或使用其他支持的脚本语言(Ruby
,R
,{{ 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行不再是真正的限制。