在Excel中将列转换为行

时间:2019-01-02 22:40:49

标签: excel transpose organization

我想在当前看起来像这样的excel中转​​置我的数据: Data Set Now

,我希望它看起来像这样: enter image description here

您看到的问题是,我不仅需要用值转置列,而且还需要为每个指标和给定国家/地区连续每年添加行。有帮助吗?

3 个答案:

答案 0 :(得分:0)

由于数据量很大,因此不确定是否可以根据图像进行操作。但是经过一些过滤和重新排列,我认为您正在寻找TRANSPOSE(array)单元格公式:


这是我们得到的:     enter image description here


  • 选择目的地范围,您要在其中放置新/好数据
  • 在编辑栏中输入=TRANSPOSE(

    enter image description here


  • 选择您的旧/坏数据的来源范围(或手动输入地址)
  • 关闭单元格公式的)

    enter image description here

  • 命中Ctrl + Shift + Enter

注意:TRANSPOSE函数接受数组作为输入(使用Ctrl + Shift + Enter完成)。

答案 1 :(得分:0)

经典移调

写完这篇文章后,它似乎不再那么经典了。

代码

Sub ClassicalTranspose()

    Const cVntSource As Variant = "Sheet1"   ' Source Worksheet Name/Index
    Const cVntTarget As Variant = "Sheet2"   ' Target Worksheet Name/Index
    Const cStrSource As String = "A1:H14"    ' Source Range
    Const cStrTarget As String = "A1"        ' Target Cell Range
    Const cInt1 As Integer = 1               ' First Repeat Column
    Const cInt2 As Integer = 2               ' Last Repeat Column
    Const cStr1 As String = "Year"           ' First New Column Header
    Const cStr2 As String = "Value"          ' Second New Column Header

    Dim vntRep As Variant    ' Repeat Array
    Dim vntUni As Variant    ' Unique Array
    Dim vntTgt As Variant    ' Target Array

    Dim intRep1 As Integer   ' First Column of Repeat Range
    Dim intRep2 As Integer   ' Last Column of Repeat Range
    Dim intUni1 As Integer   ' First Column of Unique Range
    Dim intUni2 As Integer   ' Last Column of Unique Range
    Dim lngFirst As Long     ' First Row of Source Range
    Dim lngLast As Long      ' Last Row of Source Range

    Dim i As Long            ' Source Arrays Row Counter
    Dim j As Integer         ' Source Arrays Column Counter
    Dim k As Long            ' Target Array Row Counter
    Dim l As Integer         ' Unique Array Column Counter

    ' Paste Source Range into Source Arrays (Repeat and Unique Arrays).
    With ThisWorkbook.Worksheets(cVntSource).Range(cStrSource)
        intRep1 = .Column + cInt1 - 1
        intRep2 = .Column + cInt2 - 1
        intUni1 = .Column + cInt2
        intUni2 = .Columns.Count + .Column - 1
        lngFirst = .Row
        lngLast = .Rows.Count + .Row - 1
        With .Parent
            vntRep = .Range(.Cells(lngFirst, intRep1), .Cells(lngLast, intRep2))
            vntUni = .Range(.Cells(lngFirst, intUni1), .Cells(lngLast, intUni2))
        End With
    End With

    ' Resize Target Array.
    ReDim vntTgt(1 To (UBound(vntUni) - 1) * UBound(vntUni, 2) + 1, _
            1 To UBound(vntRep, 2) + 2)

    ' Write Repeat to Target Array
    For j = 1 To UBound(vntRep, 2)
        vntTgt(1, j) = vntRep(1, j)
    Next
    k = 1
    For l = 1 To UBound(vntUni, 2)
        For i = 2 To UBound(vntRep)
            k = k + 1
            For j = 1 To UBound(vntRep, 2)
                vntTgt(k, j) = vntRep(i, j)
            Next
        Next
    Next

    ' Write Unique to Target Array
    vntTgt(1, 1 + UBound(vntRep, 2)) = cStr1
    vntTgt(1, 1 + UBound(vntRep, 2) + 1) = cStr2
    k = 1
    For j = 1 To UBound(vntUni, 2)
        For i = 2 To UBound(vntUni)
            k = k + 1
            vntTgt(k, 1 + UBound(vntRep, 2)) = vntUni(1, j)
            vntTgt(k, 2 + UBound(vntRep, 2)) = vntUni(i, j)
        Next
    Next

    ' Paste Target Array into Target Range.
    With ThisWorkbook.Worksheets(cVntTarget).Range(cStrTarget)
        .Resize(UBound(vntTgt), UBound(vntTgt, 2)) = vntTgt
    End With

End Sub

答案 2 :(得分:0)

非常感谢您的回答。斯科特·克雷纳(Scott Craner)发布了针对我问题的最佳答案,其中包含指向已回答的另一个问题的链接。

针对我的方案的理想解决方案是使用Power Query(在excel 2016及以后版本中也称为数据模型),因为我有非常大的数据集,由于它们的大小限制。我在力量查询中使用了unpivot,它像梦一样工作!

Convert matrix to 3-column table ('reverse pivot', 'unpivot', 'flatten', 'normalize')