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

66

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?

devuxer
la source
1
A trouvé la réponse: stackoverflow.com/questions/32115219/…
Quandary

Réponses:

69

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+ D, Psous Excel 2007)
  2. Sélectionnez "Je créerai mes propres champs de page".
  3. Sélectionnez vos données.
  4. Double-cliquez sur la valeur du total général - celle qui se trouve à l'intersection de Row Grand et de Column Grand , jusqu'au 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 des 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 à 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

DaveParillo
la source
Merci pour votre réponse, mais je ne suis pas tout à fait sûr de ce que vous dites ici. Pour l'exemple de ma question, que pourrais-je utiliser pour les étiquettes de ligne, les étiquettes de colonne, les valeurs et le filtre de rapport?
devuxer
Si je mets Id dans les étiquettes de ligne et Loc1 à Loc4 dans les étiquettes de colonne, puis cliquez sur la cellule inférieure droite (l'intersection des totaux généraux), une nouvelle feuille avec un tableau sera créée, mais ce n'est pas ce que je veux. Il s’agit essentiellement d’une copie du tableau croisé dynamique.
devuxer
Je suis désolé, j'ai omis une donnée critique. Le tableau croisé dynamique doit être un tableau croisé dynamique de type "plage de consolidation multiple", même si dans ce cas, vous n'avez rien à consolider.
DaveParillo
4
Ah d'accord, j'ai consulté l'aide et trouvé un moyen détourné d'obtenir l'ancien assistant de tableau croisé dynamique d'Excel 2007 (vous devez appuyer sur ALT + D + P). Maintenant, je suis capable de suivre vos pas, et cela semble fonctionner. Merci de votre aide!
devuxer
1
Voici comment exactement: stackoverflow.com/questions/32115219/…
Quandary
7

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'exemple) 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
TJMelrose
la source
1
Merci pour cela. Fonctionne comme excepté et me fait gagner beaucoup de temps.
Tigrou
Je vous remercie!! c'est juste magique! beaucoup mieux que jigiry-pokery avec des rapports non motivés qui n'ont jamais fonctionné pour moi
trailmax
1
Cela a l'air génial, mais autant que je sache, cela ne fonctionnera que pour une table qui n'a qu'un en-tête de ligne. Si la table dans l'exemple avait plusieurs en-têtes de lignes, disons qu'elle contenait un "SubId" en plus du champ Id, cela ne fonctionnerait pas. Y a-t-il un moyen facile de le modifier pour qu'il fonctionne dans cette situation?
Chris Stocking
4

Il y a une très bonne solution 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!)
Máté Juhász
la source
1
C'est certainement la meilleure réponse si vous êtes en 2010 et plus, et pas du tout évident dans l'interface. Bonne trouvaille - malheureusement, je n'ai qu'un vote positif!
JKF
3

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.

devuxer
la source
2

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 | OU | 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.

Aaa
la source
1

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 (disons 12) premières lignes dans ces colonnes et à les faire glisser vers le bas - 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.


la source
1

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

Petros
la source
1
Bienvenue sur Super User! Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Peachy
1

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

Normalisieren von Pivot Tabellen

J'espère que ça aide.

L4a-Thompson
la source
1
Bienvenue sur SuperUser! Bien que l’outil que vous avez lié offre une solution, ce message n’est utile que tant que le lien reste actif. Pour que votre message reste utile à l'avenir, veuillez modifier votre réponse pour y inclure toute information supplémentaire sur le produit, y compris son utilisation pour résoudre le problème décrit dans la question. Merci!
Excellll
1

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

Pour plusieurs colonnes avant les colonnes sans pivot

Cette méthode ne fonctionne pas.

Youtube 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

BrinkDaDrink
la source
3
Le contenu de votre réponse est un lien vers une vidéo et le contenu n’est pas décrit. Si le lien est rompu ou n'est pas disponible, votre réponse n'aura aucune valeur. Veuillez inclure les informations essentielles dans votre réponse et utiliser le lien uniquement pour l’attribution et l’exploration.
fixer1234
-2

C'est beaucoup plus simple que ça. Cliquez simplement sur l'option "Transposer" dans "Coller spécial ..." pour obtenir la transposition que vous demandez.

C Tyler
la source
1
Cela ne marcherait pas.
Zx8754