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?
Vous pouvez le faire avec un 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
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
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/
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:
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.
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.
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.
Voici un outil de Nice pour décompresser, normaliser un tableau croisé dynamique.
Normalisieren von Pivot Tabellen
J'espère que ça aide.
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
@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.