How to “flatten” or “collapse” a 2D Excel table into 1D?

前端 未结 9 969
[愿得一人]
[愿得一人] 2020-11-28 05:02

I have a two dimensional table with countries and years in Excel. eg.

        1961        1962        1963        1964
USA      a           x            g           


        
9条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-28 05:09

    You can use the excel pivot table feature to reverse a pivot table (which is essentially what you have here):

    Good instructions here:

    http://spreadsheetpage.com/index.php/tip/creating_a_database_table_from_a_summary_table/

    Which links to the following VBA code (put it in a module) if you don't want to follow the instructions by hand:

    Sub ReversePivotTable()
    '   Before running this, make sure you have a summary table with column headers.
    '   The output table will have three columns.
        Dim SummaryTable As Range, OutputRange As Range
        Dim OutRow As Long
        Dim r As Long, c As Long
    
        On Error Resume Next
        Set SummaryTable = ActiveCell.CurrentRegion
        If SummaryTable.Count = 1 Or SummaryTable.Rows.Count < 3 Then
            MsgBox "Select a cell within the summary table.", vbCritical
            Exit Sub
        End If
        SummaryTable.Select
        Set OutputRange = Application.InputBox(prompt:="Select a cell for the 3-column output", Type:=8)
    '   Convert the range
        OutRow = 2
        Application.ScreenUpdating = False
        OutputRange.Range("A1:C3") = Array("Column1", "Column2", "Column3")
        For r = 2 To SummaryTable.Rows.Count
            For c = 2 To SummaryTable.Columns.Count
                OutputRange.Cells(OutRow, 1) = SummaryTable.Cells(r, 1)
                OutputRange.Cells(OutRow, 2) = SummaryTable.Cells(1, c)
                OutputRange.Cells(OutRow, 3) = SummaryTable.Cells(r, c)
                OutputRange.Cells(OutRow, 3).NumberFormat = SummaryTable.Cells(r, c).NumberFormat
                OutRow = OutRow + 1
            Next c
        Next r
    End Sub
    

    -Adam

提交回复
热议问题