TOP

LibreOffice Calc のテーブル (Unpivo) の再編成

説明

クロス (ピボット) テーブルをフラット テーブルに変換する必要がある場合があります。この手順は「データ矯正」(unpivo data) と呼ばれます。このような「直線化」の結果、すべての同様のデータが 1 つの列に含まれるテーブルが得られます。

プログラム LibreOffice Calc には、ピボット テーブルを「フラット」に変換するための標準機能はありませんが、対応するプロシージャを自分で記述することができます。その方法を考えてみましょう。



問題の本質をより明確に理解するために、下の図を見てみましょう。左側には行列形式のテーブル (ピボット テーブル) があり、右側には列を含む通常のテーブル (フラット テーブル) があります。

テーブルを展開するときは、マトリックス テーブル内の列の交点である属性と値のペアを解凍し、フラット テーブル内のフラット化された列に方向を変更します。

  • 値(Values) (左側の青色) は新しい列 (右側の青色) に展開されます。
  • 属性 (Attributes) (左側の緑色) も新しい列 (右側の緑色) に展開され、値の新しい列に従って複製されます。
  • UnPivotTable プロシージャの BASIC コード

    メニュー Tools - Macros - Edit Macros... を開き、Module1 を選択して、次のテキストをモジュールにコピーします。

    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
      
      '新しいシートを追加する
      oBook.Sheets.insertNewByName("UnPivoted Table",0)
      oNewSheet = oBook.Sheets(0)
      
      'ヘッダーのサイズを決定する
      iTopLabelRowCount  = InputBox("一番上のヘッダーは何行ですか?")
      iSideLabelColCount = InputBox("サイドヘッダーは何列ですか?")
                
      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
    

    次に、Macro Editor を閉じて、LibreOffice Calc のワークシートに戻ります。上部と左側のヘッダーを持つテーブル全体を選択し、メニュー Tools - Macros - Run Macro... から新しいマクロを実行します。

    このマクロは、「UnPivoted Table」という名前の新しいワークシートをワークブックに挿入し、新しい形式でテーブルを追加します。このようなテーブルを使用すると、LibreOffice Calc であらゆる分析を行うことができます。

    トピックに関する記事:

  • Excel でのテーブルの再配置 (Unpivo)