将多行数据列转置为一列

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?据了解C5CLastRow。请确认或澄清。使用不同数据的示例可能更合适。 没有标题,我拥有的数据只有 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,您可以使用任何有效的东西。在这种情况下<=16384CurrentRegion 将确定行数。他们应该是<=1048756 / scCount。如果你想做列2-6,那么使用B 代表sFirstColumn5 代表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 时,我认为这就是您所指的。

以上是关于将多行数据列转置为一列的主要内容,如果未能解决你的问题,请参考以下文章

使用交叉应用将列转置为行

Postgresql 查询将列转置为行

使用 Spark 将列转置为行

Oracle:将列转置为行

将列转置为行 SQL Server

红移。我们如何(动态地)将表从列转置为行?