it-swarm-eu.dev

Come "unpivot" o "reverse pivot" in Excel?

Ho dati che assomigliano a questo:

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

E voglio convertirlo in questo:

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

Qual è il modo più semplice per farlo in Excel 2007?

65
devuxer

Puoi farlo con una tabella pivot.

  1. Creare una tabella pivot "Multiple Consolidation Ranges". (Solo nella Creazione guidata tabella pivot ALT+DP su Excel 2007)
  2. Seleziona "Creerò i miei campi della pagina".
  3. Seleziona i tuoi dati.
  4. Fare doppio clic sul valore totale generale - quello all'intersezione di Riga Grand e Column Grand , fino in fondo nell'angolo in basso a destra della tabella pivot.

Dovresti vedere un nuovo foglio contenente tutti i dati nella tabella pivot, trasposto nel modo che stai cercando.

Le tecnologie di Datapig forniscono istruzioni passo passo che sono in realtà più complicate del necessario - il suo esempio traspone solo parte del set di dati e usa la tecnica pivot combinata con TextToColumns . Ma ha molte foto.

Si noti che una tabella pivot raggrupperà i dati. Se vuoi che non sia raggruppato, l'unico modo per farlo è copiare la tabella pivot e "incolla speciale" come valori. È quindi possibile compilare gli spazi vuoti con una tecnica come questa: http://www.contextures.com/xlDataEntry02.html

69
DaveParillo

Se i dati non sono una tabella pivot di Excel ma solo dati, è possibile che si desideri "annullare la rotazione" con un semplice codice VBA. Il codice dipende da due intervalli denominati, Origine e Destinazione. Sorgente è il dato che si desidera non ruotare (esclusivo delle intestazioni di colonna/riga, ad esempio NY-RI nel campione) e Target è la prima cella in cui si desidera posizionare il risultato.

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

Ho creato un componente aggiuntivo che ti consente di farlo e questo semplifica l'adattamento a situazioni diverse. Dai un'occhiata qui: http://tduhameau.wordpress.com/2012/09/24/the-unpivot-add-in/

5
nutsch

C'è una soluzione abbastanza buona in Excel 2010, basta giocare un po 'con la tabella pivot.

Crea una tabella pivot dai tuoi dati con queste impostazioni:

  • nessun subtotale, nessun totale generale
  • layout del report: modulo tabellare, ripetere tutte le etichette degli articoli
  • aggiungi tutte le colonne di cui hai bisogno, mantieni le colonne che vuoi trasformare a destra
  • per ogni colonna che vuoi trasformare: apri le impostazioni del campo - nella scheda di layout e stampa: seleziona "Mostra etichette articolo in forma di contorno" e seleziona entrambe le caselle di controllo sotto di essa
  • copia la tua tabella in una posizione separata (solo valori)
  • se hai celle vuote nei dati originali, filtra per i valori vuoti nella colonna più a destra ed elimina quelle righe (non filtrare nella tabella pivot in quanto non funzionerà come ti serve!)
3
Máté Juhász

La cosa migliore che ho trovato finora è questa:

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)

Funziona, ma devo generare manualmente l'Id e il LocNum. Se c'è una soluzione più automatica (oltre a scrivere una macro), per favore fammelo sapere in una risposta separata.

3
devuxer

Se le dimensioni dei dati sono come nell'esempio fornito nella domanda, il seguente insieme di formule che utilizza OFFSET dovrebbe fornire il risultato richiesto:

Assumendo

1 | NY | CA | TX | I L

2 | WA | OR | NH | RI

sono nell'intervallo A2: E3, quindi immettere

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

in F2, ad esempio, e

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

in G2, ad esempio, e

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

in H2, per esempio.

Quindi copiare queste formule fino a quando necessario.

Questa è la soluzione di formula integrata più semplice, pura, a cui possa pensare.

2
Aaa

Sembra che tu abbia ottenuto la colonna "loc" (evidenziata dalla tua prima risposta), e ora hai bisogno di aiuto per ottenere le altre due colonne.

La prima opzione è quella di digitare semplicemente le prime diverse (diciamo, 12) righe in quelle colonne e trascinare verso il basso - penso che Excel faccia la cosa giusta in questo caso (non ho Excel su questo computer per testarlo di sicuro).

Se ciò non funziona, o se vuoi qualcosa di più programmatore-y, prova a usare la funzione row (). Qualcosa come "= Floor (row ()/4)" per la colonna ID e "= mod (row (), 4) +1" per la colonna LocNum.

1
Roie Marianer

Ecco uno strumento per sbloccare, normalizzare una tabella pivot.

Normalisieren von Pivot Tabellen

Spero possa essere d'aiuto.

1
L4a-Thompson

È disponibile un'utilità di conversione VBA parametrica per annullare l'inversione o l'inversione dei dati pivot su una tabella di database, vedere

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

1
Petros

La risposta @DaveParillo è la migliore risposta per una singola tabella tab. Volevo aggiungere alcuni extra qui.

Per colonne multiple pre le colonne unpivot

Questo metodo non funziona.

Youtube non visualizzare i dati semplici come la domanda

Questo è un video di YouTube che mostra come farlo in un modo semplice. Ho saltato la parte sull'aggiunta del collegamento e ho usato il collegamento @devuxer che è in risposta a DaveParillo.

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

1
BrinkDaDrink