TOP
Réorganisation des tables (Unpivot) dans LibreOffice Calc
Description
Parfois, il est nécessaire de convertir un tableau croisé (pivot) en un tableau plat. Cette procédure est appelée " redressement des données " (unpivot data) . À la suite d'un tel " redressage " nous obtenons un tableau où toutes les données similaires sont dans une seule colonne.
Le programme LibreOffice Calc n'a pas de fonctionnalité standard pour convertir les tableaux croisés dynamiques en " plat ", mais vous pouvez écrire vous-même la procédure correspondante. Voyons comment procéder.
Regardons l'image ci-dessous pour mieux comprendre l'essence du problème. A gauche nous avons un tableau sous forme de matrice (tableau croisé dynamique), et à droite - un tableau régulier avec des colonnes (tableau plat) :
Lorsque vous développez une table, vous décompressez la paire attribut-valeur qui constitue l'intersection des colonnes de la table matricielle et vous les réorientez vers les colonnes aplaties de la table plate :
Valeur (Values) (bleu à gauche) se développe dans une nouvelle colonne (bleu à droite) ;
Les attributs (Attributes) (vert à gauche) sont également développés dans une nouvelle colonne (vert à droite) et dupliqués selon la nouvelle colonne de valeurs.
Code StarBASIC pour la procédure UnPivotTable
Ouvrez le menu Tools - Macros - Edit Macros..., sélectionnez Module1 et copiez le texte suivant dans le module :
- Sub UnPivotTable
-
- 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(" Combien de lignes dans l’en-tête supérieur ? ")
- iSideLabelColCount = InputBox(" Combien de colonnes dans l’en-tête latéral ? ")
-
- 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
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
' Ajouter une nouvelle feuille
oBook.Sheets.insertNewByName("UnPivoted Table",0)
oNewSheet = oBook.Sheets(0)
' Déterminer la taille des en-têtes
iTopLabelRowCount = InputBox(" Combien de lignes dans l’en-tête supérieur ? ")
iSideLabelColCount = InputBox(" Combien de colonnes dans l’en-tête latéral ? ")
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
Ensuite, fermez Macro Editor et revenez à votre feuille de calcul dans LibreOffice Calc. Sélectionnez le tableau entier avec les en-têtes en haut et à gauche et exécutez notre nouvelle macro via le menu Tools - Macros - Run Macro...
La macro insérera une nouvelle feuille nommée dans votre classeur "UnPivoted Table" , puis ajoutez un tableau au nouveau format. Avec une telle table, vous pouvez effectuer n'importe quelle analyse dans LibreOffice Calc.
Utiliser l'extension
Vous pouvez également utiliser l'utilitaire "Tableau croisé dynamique (Unpivot)" en installant l'extension YLC_Utilities.oxt .
Après cela, cet utilitaire sera disponible dans tous les fichiers qui seront ouverts dans LibreOffice Calc.
Articles sur le sujet :
Réorganisation des tables (Unpivot) dans Excel