73 votes

Comment "dépivoter" ou "inverser le pivot" dans Excel ?

J'ai des données qui ressemblent à ceci :

Id | Loc1 | Loc2 | Loc3 | Loc4
---+------+------+------+-----
1  | NY   | CA   | TX   | IL
2  | WA   | OR   | NH   | RI

Et je veux le convertir en ceci :

Id | LocNum | Loc
---+--------+----
1  |   1    | NY
1  |   2    | CA
1  |   3    | TX
1  |   4    | IL
2  |   1    | WA
2  |   2    | OR
2  |   3    | NH
2  |   4    | RI

Quel est le moyen le plus simple de faire cela dans Excel 2007 ?

71voto

DaveParillo Points 14135

Vous pouvez le faire avec un tableau croisé dynamique.

  1. Créez un tableau croisé dynamique "Plages de consolidation multiples". (Uniquement sur l'Assistant Tableau Pivot. Appelez avec ALT + D , P sur Excel 2007)
  2. Sélectionnez "Je vais créer mes propres champs de page".
  3. Sélectionnez vos données.
  4. Double-cliquez sur la valeur du grand total - celle qui se trouve à l'intersection de Row Grand y Colonne Grand dans le coin inférieur droit de votre tableau croisé dynamique.

Vous devriez voir une nouvelle feuille contenant toutes les données de votre tableau croisé dynamique, transposées de la manière souhaitée.

Datapig technologies fournit instructions par étapes qui sont en fait plus compliqués que ce dont vous avez besoin - son exemple ne transpose qu'une partie de l'ensemble des données et utilise la technique du pivot combinée à la technique de l'analyse des données. TextToColumns . Mais il y a beaucoup de photos.

Notez qu'un tableau croisé dynamique regroupera les données. Si vous voulez qu'elles ne soient pas groupées, la seule façon de le faire est de copier le tableau croisé dynamique et de faire un "collage spécial" des valeurs. Vous pouvez ensuite remplir les blancs avec une technique comme celle-ci : http://www.contextures.com/xlDataEntry02.html

8voto

Polisetty Points 111

Si vos données ne sont pas un tableau croisé dynamique Excel mais simplement des données, vous pouvez les "dé-pivoter" à l'aide d'un simple code VBA. Ce code dépend de deux plages nommées, Source et Cible. La source est la donnée que vous voulez déplier (à l'exclusion des en-têtes de colonne/rangée, par exemple NY-RI dans l'exemple) et la cible est la première cellule où vous voulez placer votre résultat.

Sub unPivot()
Dim oTarget As Range
Dim oSource As Range
Dim oCell As Range

Set oSource = Names("Source").RefersToRange
Set oTarget = Names("Target").RefersToRange

For Each oCell In oSource
    If oCell.Value <> "" Then
        oTarget.Activate
      ' get the column header
        oTarget.Value = oCell.Offset(-(oCell.Row - oSource.Row + 1), 0).Text 
      ' get the row header
         oTarget.Offset(0, 1).Value = oCell.Offset(0, _
           -(oCell.Column - oSource.Column + 1)).Text 
      ' get the value
        oTarget.Offset(0, 2).Value = oCell.Text 
      ' move the target pointer to the next row
        Set oTarget = oTarget.Offset(1, 0) 
    End If
Next
Beep
End Sub

5voto

nutsch Points 1963

J'ai construit un module complémentaire qui vous permettra de le faire, et qui permet de s'adapter facilement à différentes situations. Découvrez-le ici : http://tduhameau.wordpress.com/2012/09/24/the-unpivot-add-in/

5voto

Máté Juhász Points 20291

Il existe une solution intéressante dans Excel 2010, il suffit de jouer un peu avec le tableau croisé dynamique.

Créez un tableau croisé dynamique à partir de vos données avec ces paramètres :

  • pas de sous-totaux, pas de totaux généraux
  • mise en page du rapport : forme tabulaire, répétition de toutes les étiquettes d'éléments
  • ajouter toutes les colonnes dont vous avez besoin, garder les colonnes que vous voulez transformer à droite
  • pour chaque colonne que vous voulez transformer : ouvrez les paramètres du champ - dans l'onglet "Mise en page et impression" : sélectionnez "Afficher les étiquettes des éléments dans le formulaire de contour" et cochez les deux cases en dessous.
  • copier votre table à un autre endroit (juste des valeurs)
  • si vous avez des cellules vides dans vos données originales, filtrez les valeurs vides dans la colonne la plus à droite et supprimez ces lignes (ne filtrez pas dans le tableau croisé dynamique car cela ne fonctionnera pas comme vous le souhaitez !)

4voto

devuxer Points 3771

Le mieux que j'ai trouvé jusqu'à présent, c'est ça :

Id   LocNum  Loc
---------------------------------
1    1       =INDEX(Data,A6,B6)
1    2       =INDEX(Data,A7,B7)
1    3       =INDEX(Data,A8,B8)
1    4       =INDEX(Data,A9,B9)
2    1       =INDEX(Data,A10,B10)
2    2       =INDEX(Data,A11,B11)
2    3       =INDEX(Data,A12,B12)
2    4       =INDEX(Data,A13,B13)

Cela fonctionne, mais je dois générer les Id's et LocNum's manuellement. S'il existe une solution plus automatisée (en dehors de l'écriture d'une macro), veuillez me le faire savoir dans une réponse séparée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X