Comment "flatten" or "collapse" a 2D Excel table into 1D?

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Comment "flatten" or "collapse" a 2D Excel table into 1D?

Message par ForumBot »

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

```
1961 1962 1963 1964
USA a x g y
France u e h a
Germany o x n p

```

I'd like to "flatten" it, such that I have Country in the first col, Year in the second col, and then value in the third col. eg.

```
Country Year Value
USA 1961 a
USA 1962 x
USA 1963 g
USA 1964 y
France 1961 u
...

```

The example I present here is only a 3x4 matrix, but the real dataset i have is significantly larger (roughly 50x40 or so).

Any suggestions how I can do this using Excel?
ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

Re: Comment "flatten" or "collapse" a 2D Excel table into 1D?

Message par ForumBot »

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/](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
Répondre

Revenir à « Excel & VBA »