web-dev-qa-db-fra.com

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

Quelle est la façon la plus simple de procéder dans Excel 2007?

65
devuxer

Vous pouvez le faire avec un tableau croisé dynamique.

  1. Créer un "tableau croisé dynamique de plages de consolidation multiples." (Uniquement dans l’assistant de tableau croisé dynamique. Appel avec ALT+DP sur Excel 2007)
  2. Sélectionnez "Je créerai mes propres champs de page".
  3. Sélectionnez vos données.
  4. Double-cliquez sur le total général - celui situé à l'intersection de rangée grand et colonne grand , tout le chemin 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ée dans le sens que vous recherchez.

Les technologies Datapig fournissent instructions pas à pas qui sont en réalité plus compliquées que nécessaire - son exemple transpose une partie seulement du jeu de données et utilise la technique de pivot combinée avec TextToColumns . Mais il y a beaucoup de photos.

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

69
DaveParillo

Si vos données ne sont pas un tableau croisé dynamique Excel, mais uniquement des données, vous pouvez les "dé-pivoter" avec un code VBA simple. Le code dépend de deux plages nommées, Source et Target. La source représente les données que vous souhaitez dé-pivoter (à l’exclusion des en-têtes de colonne/ligne, par exemple NY-RI dans l’échantillon) et Target est la première cellule dans laquelle vous souhaitez 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
6
TJMelrose

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

5
nutsch

Il existe une solution plutôt 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-total, pas de grand total
  • mise en page du rapport: forme tabulaire, répéter toutes les étiquettes
  • ajoutez toutes les colonnes dont vous avez besoin, conservez les colonnes que vous souhaitez transformer à droite
  • pour chaque colonne à transformer: paramètres de champs ouverts - dans l'onglet Mise en page et impression: sélectionnez "Afficher les étiquettes des éléments sous forme hiérarchique" et cochez les deux cases en dessous.
  • copier votre table dans un emplacement séparé (juste des valeurs)
  • si vous avez des cellules vides dans vos données d'origine, 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!)
3
Máté Juhász

Le mieux que j'ai trouvé jusqu'ici est ceci:

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 et LocNum manuellement. S'il existe une solution plus automatisée (à part l'écriture d'une macro), merci de me le faire savoir dans une réponse séparée.

3
devuxer

Si les dimensions de vos données sont identiques à celles de l'exemple fourni dans votre question, l'ensemble de formules suivant utilisant OFFSET devrait vous donner le résultat souhaité:

En supposant

1 | NY | CA | TX | IL

2 | WA | OR | NH | RI

sont dans la plage A2: E3, puis entrez

= OFFSET ($ A $ 2, ÉTAGE ((ROW (A2) -ROW ($ A $ 2))/4,1), 0)

en F2, par exemple, et

= MOD (ROW (A2) -ROW ($ A $ 2), 4) +1

dans G2, par exemple, et

= OFFSET ($ B $ 2, PLANCHER ((ROW (B2) -ROW ($ B $ 2))/4,1), MOD (ROW (A2) -ROW ($ A $ 2), 4))

dans H2, disons.

Copiez ensuite ces formules autant que nécessaire.

C’est la solution la plus simple, pure et intégrée à laquelle je puisse penser.

2
Aaa

Vous semblez avoir obtenu la colonne "loc" (comme en témoigne votre première réponse), et vous avez maintenant besoin d'aide pour obtenir les deux autres colonnes.

Votre première option consiste simplement à taper les premières lignes (disons 12) dans ces colonnes et à les faire glisser - je pense qu'Excel fait la bonne chose dans ce cas (je n'ai pas Excel sur cet ordinateur pour le tester à coup sûr).

Si cela ne fonctionne pas, ou si vous voulez quelque chose de plus programmeur-y, essayez d'utiliser la fonction row (). Quelque chose comme "= Floor (row ()/4)" pour la colonne ID et "= mod (row (), 4) +1" pour la colonne LocNum.

1
Roie Marianer

Voici un outil de Nice pour décompresser, normaliser un tableau croisé dynamique.

Normalisieren von Pivot Tabellen

J'espère que ça aide.

1
L4a-Thompson

Il existe un utilitaire de conversion paramétrique VBA permettant de retourner des données pivotées ou non pivotées dans une table de base de données. Pour plus d'informations, reportez-vous à la section

http://www.spreadsheet1.com/unpivot-data.html

1
Petros

@DaveParillo answer est la meilleure réponse pour un seul tableau à onglets. Je voulais ajouter quelques extras ici.

Pour les colonnes multiples précédant les colonnes non pivotées

Cette méthode ne fonctionne pas.

Youtube des données simples non pivotées comme la question

Ceci est une vidéo youtube montrant comment le faire de manière simple. J'ai ignoré la partie sur l'ajout du raccourci et utilisé le raccourci @devuxer qui est dans DaveParillo answer.

https://www.youtube.com/watch?v=pUXJLzqlEPk

1
BrinkDaDrink