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

前端 未结 9 939
[愿得一人]
[愿得一人] 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:18

    I developed another macro because I needed to refresh the output table quite often (input table was filled by other) and I wanted to have more info in my output table (more copied column and some formulas)

    Sub TableConvert()
    
    Dim tbl As ListObject 
    Dim t
    Rows As Long
    Dim tCols As Long
    Dim userCalculateSetting As XlCalculation
    Dim wrksht_in As Worksheet
    Dim wrksht_out As Worksheet
    
    '##block calculate and screen refresh
    Application.ScreenUpdating = False
    userCalculateSetting = Application.Calculation
    Application.Calculation = xlCalculationManual
    
    '## get the input and output worksheet
    Set wrksht_in = ActiveWorkbook.Worksheets("ressource_entry")'## input
    Set wrksht_out = ActiveWorkbook.Worksheets("data")'## output.
    
    
    '## get the table object from the worksheet
    Set tbl = wrksht_in.ListObjects("Table14")  '## input
    Set tb2 = wrksht_out.ListObjects("Table2") '## output.
    
    '## delete output table data
    If Not tb2.DataBodyRange Is Nothing Then
        tb2.DataBodyRange.Delete
    End If
    
    '## count the row and col of input table
    
    With tbl.DataBodyRange
         tRows = .Rows.Count
         tCols = .Columns.Count
    End With
    
    '## check every case of the input table (only the data part)
    For j = 2 To tRows '## parse all row from row 2 (header are not checked)
        For i = 5 To tCols '## parse all column from col 5 (first col will be copied in each record)
            If IsEmpty(tbl.Range.Cells(j, i).Value) = False Then
                '## if there is time enetered create a new row in table2 by using the first colmn of the selected cell row and cell header plus some formula
                Set oNewRow = tb2.ListRows.Add(AlwaysInsert:=True)
                oNewRow.Range.Cells(1, 1).Value = tbl.Range.Cells(j, 1).Value
                oNewRow.Range.Cells(1, 2).Value = tbl.Range.Cells(j, 2).Value
                oNewRow.Range.Cells(1, 3).Value = tbl.Range.Cells(j, 3).Value
                oNewRow.Range.Cells(1, 4).Value = tbl.Range.Cells(1, i).Value
                oNewRow.Range.Cells(1, 5).Value = tbl.Range.Cells(j, i).Value
                oNewRow.Range.Cells(1, 6).Formula = "=WEEKNUM([@Date])"
                oNewRow.Range.Cells(1, 7).Formula = "=YEAR([@Date])"
                oNewRow.Range.Cells(1, 8).Formula = "=MONTH([@Date])"
            End If
       Next i
    Next j
    ThisWorkbook.RefreshAll
    
    '##unblock calculate and screen refresh
    Application.ScreenUpdating = True 
    Application.Calculate
    Application.Calculation = userCalculateSetting
    
    End Sub
    

提交回复
热议问题