TOP

Reorganizacja tabel (Unpivot) w LibreOffice Calc

Opis

Czasem zachodzi potrzeba zamiany tabeli krzyżowej (przestawnej) na płaską. Procedura ta nazywa się „ prostowanie danych " (unpivot data) . W wyniku takiego „ prostowanie „otrzymujemy tabelę, w której wszystkie podobne dane znajdują się w jednej kolumnie.

Program LibreOffice Calc nie posiada standardowej funkcjonalności konwersji tabel przestawnych na „ płaski ", ale możesz sam napisać odpowiednią procedurę. Zobaczmy, jak to zrobić.



Spójrzmy na poniższy obrazek, aby lepiej zrozumieć istotę problemu. Po lewej stronie mamy tabelę w postaci macierzy (tabela przestawna), a po prawej zwykłą tabelę z kolumnami (tabela płaska):

Kiedy rozwijasz tabelę, rozpakowujesz parę atrybut-wartość, która jest punktem przecięcia kolumn w tabeli macierzowej i zmieniasz ich orientację na spłaszczone kolumny w płaskiej tabeli:

  • Wartość (Values) (niebieski po lewej) rozwiń do nowej kolumny (niebieski po prawej);
  • Atrybuty (Attributes) (zielone po lewej) są również rozwijane w nowej kolumnie (zielone po prawej) i powielane zgodnie z nową kolumną wartości.
  • BASIC kod procedury UnPivotTable

    Otwórz menu Tools - Macros - Edit Macros..., wybierz Module1 i skopiuj następujący tekst do modułu:

    Sub UnPivotTable
      ' moonexcel.com.ua 
      Dim oBook        As Object
      Dim oActiveSheet As Object
      Dim oSelRange    As Object
      Dim oNewSheet    As Object
      
      Dim i                  As Long
      Dim iTopLabelRowCount  As Integer
      Dim iSideLabelColCount As Integer       
      
      oBook        = ThisComponent
      oActiveSheet = oBook.CurrentController.ActiveSheet
      oSelRange    = oBook.CurrentSelection
      
      ' Dodaj nowy arkusz 
      oBook.Sheets.insertNewByName("UnPivoted Table",0)
      oNewSheet = oBook.Sheets(0)
      
      ' Określ rozmiar nagłówków 
      iTopLabelRowCount  = InputBox(" Ile linii w górnym nagłówku? ")
      iSideLabelColCount = InputBox(" Ile kolumn w bocznym nagłówku? ")
                
      i = 0
         
      For r = (iTopLabelRowCount + 1) To oSelRange.Rows.Count
        For c = (iSideLabelColCount + 1) To oSelRange.Columns.Count            
                           
          For j = 1 To iSideLabelColCount              
            oNewSheet.getCellByPosition(j-1, i).Formula = oSelRange.getCellByPosition(j-1, r-1).Formula               
          Next j
                 
          For k = 1 To iTopLabelRowCount
            oNewSheet.getCellByPosition(j + k - 2, i).Formula = oSelRange.getCellByPosition(c-1, k-1).Formula
          Next k           
                             
          oNewSheet.getCellByPosition(j + k - 2, i).Formula = oSelRange.getCellByPosition(c-1, r-1).Formula
          i = i + 1                   
                
        Next c
      Next r
    End Sub
    

    Następnie zamknij Macro Editor i wróć do arkusza w LibreOffice Calc. Wybierz całą tabelę z górnym i lewym nagłówkiem i uruchom nasze nowe makro poprzez menu Tools - Macros - Run Macro...

    Makro wstawi nowy nazwany arkusz do skoroszytu "UnPivoted Table" , a następnie dodaj tabelę w nowym formacie. Za pomocą takiej tabeli możesz przeprowadzić dowolną analizę w LibreOffice Calc.

    Artykuły na ten temat:

  • Reorganizacja tabeli (Unpivot) w Excel