将多行数据列转置为一列
Posted
技术标签:
【中文标题】将多行数据列转置为一列【英文标题】:Transpose multiple rows of column of data into one column 【发布时间】:2021-04-04 13:05:29 【问题描述】:我正在尝试将多列行转换为一列
我知道有人问过这个问题,我已经尝试过一段时间,但无法根据需要让它工作。我在前面的例子中遇到的问题是输出不是我需要的格式,它对数字进行分组而不是按顺序排列。
示例数组是:
1 1 1
2 2 2
3 3 3
4 4 4
输出:
1
2
3
4
1
2
3
4
1
2
3
4
我知道这种大小的数据可以在 excel 的查询编辑器中完成。但我需要将数据序列复制到 2300 行。因此,我的示例数组数据将包含 2300 行,这需要很长时间才能取消透视。此外,unpivot 函数不会将数据合并到订单中。
我已经从post 尝试了这个示例,但它无法根据需要开始工作。获取未定义的函数或子。
Sub Tester()
Dim p
'get the unpivoted data as a 2-D array
p = UnPivotData(Sheets("Sheet1").Range("A1").CurrentRegion, _
3, False, False)
With Sheets("Sheet1").Range("H1")
.CurrentRegion.ClearContents
.Resize(UBound(p, 1), UBound(p, 2)).Value = p 'populate array to sheet
End With
'EDIT: alternative (slower) method to populate the sheet
' from the pivoted dataset. Might need to use this
' if you have a large amount of data
'Dim r As Long, c As Long
'For r = 1 To Ubound(p, 1)
'For c = 1 To Ubound(p, 2)
' Sheets("Sheet2").Cells(r, c).Value = p(r, c)
'Next c
'Next r
End Sub
我是 VBA 新手,并没有进行太多探索,我正在尝试为这项工作找到一个示例。
编辑
示例是否可以灵活地允许包含 500 多行的列数组,而不是仅匹配示例中的范围?
【问题讨论】:
您的表格是否以A1
开头?它有标题吗?你想要来自例如的数据吗? A2:C5
复制到H2:H13
?据了解C5
为CLastRow
。请确认或澄清。使用不同数据的示例可能更合适。
没有标题,我拥有的数据只有 1-4 我想将 x 行的列转换为一列。启动单元格 A1
【参考方案1】:
堆叠列
从Google Drive
下载工作簿(右上角的向下箭头)。
调整常量部分中的值。
Option Explicit
Sub stackColumns()
Const sName As String = "Sheet1"
Const sFirstColumn As String = "A"
Const scCount As Long = 3
Const dName As String = "Sheet1"
Const dFirstCell As String = "H2"
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim srg As Range
Dim srCount As Long
With wb.Worksheets(sName).Range("A1").CurrentRegion.Columns(sFirstColumn)
srCount = .Rows.Count - 1
Set srg = .Resize(srCount, scCount).Offset(1)
End With
Dim Data As Variant: Data = srg.Value
Dim Result As Variant: ReDim Result(1 To srCount * scCount, 1 To 1)
Dim r As Long, c As Long, n As Long
For c = 1 To scCount
For r = 1 To srCount
n = n + 1
Result(n, 1) = Data(r, c)
Next r
Next c
With wb.Worksheets(dName).Range(dFirstCell)
.Resize(n).Value = Result
.Resize(.Worksheet.Rows.Count - .Row - n + 1).Offset(n).ClearContents
End With
End Sub
编辑
Sub stackColumns2()
Const sName As String = "Sheet1"
Const sFirstColumn As String = "A"
Const scCount As Long = 3
Const dName As String = "Sheet1"
Const dFirstCell As String = "H1"
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim srg As Range: Set srg = wb.Worksheets(sName).Range("A1") _
.CurrentRegion.Columns(sFirstColumn).Resize(, scCount)
Dim srCount As Long: srCount = srg.Rows.Count
Dim Data As Variant: Data = srg.Value
Dim Result As Variant: ReDim Result(1 To srCount * scCount, 1 To 1)
Dim r As Long, c As Long, n As Long
For c = 1 To scCount
For r = 1 To srCount
n = n + 1
Result(n, 1) = Data(r, c)
Next r
Next c
With wb.Worksheets(dName).Range(dFirstCell)
.Resize(n).Value = Result
.Resize(.Worksheet.Rows.Count - .Row - n + 1).Offset(n).ClearContents
End With
End Sub
【讨论】:
感谢您的反馈,是否将第 2-6 列恰好附加在一列下方,而不是在两个单独的列中 几乎可以正常工作,但错过了第一个单元格。而不是输出是 1,2,3,4 x4。它的 2、3、4、x4。 我添加了另一个版本。 我很抱歉你添加了一个标题,我只是在我的表格中添加了一个标题它可以工作:)。但是,对于我的示例,我将数据范围从 4 行列扩展到 500 多个列,如何编辑代码以使其工作。尝试使用它使其工作,但无法弄清楚 您只需要列数:scCount
。它是示例数据中的3
,您可以使用任何有效的东西。在这种情况下<=16384
。 CurrentRegion
将确定行数。他们应该是<=1048756 / scCount
。如果你想做列2-6
,那么使用B
代表sFirstColumn
和5
代表scCount
。【参考方案2】:
要将多列转换为单列,并保持列顺序而不是转换为行顺序,只需在反透视之前转置表格即可。
例如:
let
Source = Excel.CurrentWorkbook()[Name="Table2"][Content],
#"Transposed Table" = Table.Transpose(Source),
#"Unpivoted Only Selected Columns" = Table.UnpivotOtherColumns(#"Transposed Table", , "Attribute", "Value"),
#"Removed Columns" = Table.RemoveColumns(#"Unpivoted Only Selected Columns","Attribute")
in
#"Removed Columns"
在 2500 列 * 100 行的矩阵上,此查询在不到一秒的时间内完成。
【讨论】:
在 excel 的查询编辑器选项卡中有什么内容 我不明白你的问题。这是Power Query M code
。在 Windows Excel 2010+ 或 Excel Office 365 中从 Data=>Get&Transform=>from Table/Range
访问。当您编写 query 时,我认为这就是您所指的。以上是关于将多行数据列转置为一列的主要内容,如果未能解决你的问题,请参考以下文章