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 llama " enderezamiento de datos " (unpivot data) . Como resultado de tal " Alisar "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 " departamento ", pero puedes escribir tú mismo el procedimiento correspondiente. Veamos 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 de la tabla plana:

  • Valor (Values) (azul a la izquierda) expandirse a una nueva columna (azul a la derecha);
  • Atributos (Attributes) (verde a la izquierda) también se expanden en una nueva columna (verde a la derecha) y se duplican de acuerdo con 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 con nombre en su libro de trabajo. "UnPivoted Table" y luego agregue 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:

  • Reorganización de tablas (Unpivot) en Excel