TOP

Reorganización de tablas (Unpivot) en LibreOffice Calc

Descripción

A veces es necesario convertir una tabla transversal (pivotante) en una plana. Este procedimiento se denomina "rectificación de datos" (unpivot data). Como resultado de este "enderezamiento" obtenemos una tabla donde todos los datos similares están en una columna.

El programa LibreOffice Calc no tiene una funcionalidad estándar para convertir tablas dinámicas a "planas", pero usted mismo puede escribir el procedimiento correspondiente. Consideremos cómo hacerlo.



Miremos la imagen a continuación para comprender más claramente la esencia del problema. A la izquierda tenemos una tabla en forma de matriz (tabla dinámica) y a la derecha, una tabla normal con columnas (tabla plana):

Cuando expandes una tabla, descomprimes el par atributo-valor que es el punto de intersección de las columnas en la tabla de matriz y las reorientas en las columnas aplanadas en la tabla plana:

  • Los valores (Values) (azul a la izquierda) se expanden a una nueva columna (azul a la derecha);
  • Los atributos (Attributes) (verde a la izquierda) también se expanden en una nueva columna (verde a la derecha) y se duplican según la nueva columna de valores.
  • Código BASIC para el procedimiento UnPivotTable

    Abra el menú Tools - Macros - Edit Macros..., seleccione Module1 y copie el siguiente texto en el módulo:

    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
      
      'Agregar una nueva hoja
      oBook.Sheets.insertNewByName("UnPivoted Table",0)
      oNewSheet = oBook.Sheets(0)
      
      'Determinar el tamaño de los encabezados.
      iTopLabelRowCount  = InputBox("¿Cuántas líneas hay en el encabezado superior?")
      iSideLabelColCount = InputBox("¿Cuántas columnas hay en el encabezado lateral?")
                
      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
    

    Luego, cierre Macro Editor y regrese a su hoja de trabajo en LibreOffice Calc. Seleccione toda la tabla con los encabezados superior e izquierdo y ejecute nuestra nueva macro a través del menú Tools - Macros - Run Macro...

    La macro insertará una nueva hoja de trabajo llamada "Tabla no dinámica" en su libro de trabajo y luego agregará una tabla en el nuevo formato. Con una tabla de este tipo puedes hacer cualquier análisis en LibreOffice Calc.

    Artículos sobre el tema:

  • Reorganizar tablas (Unpivot) en Excel