2015-09-24 26 views
8

Diciamo che ho una tabella come questa:Pivot in Excel senza aggregazione, per mostrare il testo, non i numeri?

Country Region Mytext 
USA  North a 
USA  South b 
Brasil North c 
Brasil South d 

Come posso ottenere un perno come questo in Excel?

Country North   South 
USA  a    b 
Brasil c    d 

Se 'mytext' fosse un numero, che potrebbe fare una tabella pivot: poiché non v'è una sola riga per combinazione del paese e regione, min = max = somma = medio e una di queste funzioni aggregato, in effetti, mostrami il risultato che voglio.

Ma cosa succede quando il campo che desidero è non numerico? Con la libreria panda di Python, posso usare il metodo dataframe.pivot() anche su campi non numerici, ma non ho trovato il modo di fare lo stesso in Excel. Potrei associare un numero a ogni riga, fare il pivot in Excel per mostrare quel numero, e quindi fare una ricerca per ottenere il testo associato, ma sembra un processo piuttosto complicato per qualcosa che dovrebbe essere davvero più semplice!

+0

Vedere [Devo usare i tag nei titoli?] (Http://meta.stackexchange.com/help/tagging). – pnuts

+3

Io rispettosamente non sono d'accordo con la tua modifica. Il modo in cui hai modificato il mio titolo rende impossibile capire se la domanda si riferisce a Excel, a SQL o a uno dei software e lingue disponibili. Potresti dire che avrei potuto scrivere 'Pivot [...] in Excel' piuttosto che 'Excel: Pivot' (le piccole cose divertono le piccole menti ...) ma rimango convinto che citare Excel nel titolo sia importante, altrimenti il ​​titolo diventa troppo ambiguo. –

+0

Sentiti libero di tornare indietro. Ma sappiamo che il tuo post riguarda Excel dal tag e con 10M + domande lo spazio limitato in Titoli è, IMO, meglio utilizzato per * differenziare * il tuo Q dagli altri, piuttosto che perderlo tra 75k + altri Excel Q. cioè stavo cercando di far risaltare il tuo Q - potrebbe essere una migliore possibilità di risposte veloci/di qualità - ma se preferisci "fondere" ciò va bene per me. – pnuts

risposta

5

è possibile utilizzare il MS Power Query Add-in *. Tavoli girevoli è senza VBA giusto facile. È gratuito e molto efficace per la trasformazione dei dati.

l'M-Code

let 
    Source = Excel.CurrentWorkbook(){[Name="table1"]}[Content], 
    #"Pivot column" = Table.Pivot(Source, List.Distinct(Source[Region]), "Region", "Mytext") 
in 
    #"Pivot column" 

tua uscita enter image description here

'* da MS Office 2016, è completamente integrato in Excel come Get & Transform funzione.

+0

quasi identico a Python panda - tha NKS! –

+2

Per farlo con la GUI: selezionare la tabella -> power query -> excel data -> dalla tabella -> selezionare la colonna 'region' -> transform -> column pivot -> valori column: mytext -> opzioni avanzate: don aggregare. Se si modifica l'origine originale e si fa clic con il tasto destro sulla tabella di output, l'output viene aggiornato. –

+0

In MS Office 2016, avrete bisogno di una singola colonna per le intestazioni. Elimina le colonne ridondanti (o la tabella sarà sparsa), quindi ruota la colonna dell'intestazione, selezionando il campo del valore e "Non aggregare". –

3

Aggiungere il MyText come etichetta di riga sotto l'etichetta Paese, quindi visualizzare la tabella pivot in formato tabulare sotto la scheda di progettazione Tabella pivot. Ripeti le etichette degli articoli per il campo dell'etichetta della riga del paese.

+0

Potresti essere un po 'più specifico? Ho paura di non averlo seguito. Ho giocato con il formato tabulare ma non riesco a vedere un modo per ottenere l'output di cui ho bisogno. Grazie! –

2

Questo può essere fatto, ma richiede a VBA di sovrascrivere temporaneamente un valore numerico "segnaposto" nella tabella pivot con del testo. Per abilitare ciò, è necessario impostare EnableDataValueEditing = True per la tabella pivot. All'aggiornamento, si effettua una ricerca sul valore numerico del segnaposto e lo si sostituisce con il testo. Convolto, sì. Soluzione alternativa, sì. Ma fa il trucco. Notare che questo "si blocca" solo fino al successivo aggiornamento della tabella pivot, quindi questo codice deve essere attivato per ogni aggiornamento.

Ecco il codice che uso per farlo in uno dei miei progetti. Mettere questo in un modulo di codice standard:

Function Pivots_TextInValuesArea(pt As PivotTable, rngNumeric As Range, rngText As Range, Optional varNoMatch As Variant) 

Dim cell As Range 
Dim varNumeric As Variant 
Dim varText As Variant 
Dim varResult As Variant 
Dim bScreenUpdating As Boolean 
Dim bEnableEvents As Boolean 
Dim lngCalculation As Long 


On Error GoTo errHandler 
With Application 
    bScreenUpdating = .ScreenUpdating 
    bEnableEvents = .EnableEvents 
    lngCalculation = .Calculation 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .Calculation = xlCalculationManual 
End With 


varNumeric = rngNumeric 
varText = rngText 

pt.EnableDataValueEditing = True 
'Setting this to TRUE allow users or this code to temporarily overwrite PivotTable cells in the VALUES area. 
'Note that this only 'sticks' until the next time the PivotTable is refreshed, so this code needs to be 
' triggerred on every refresh 

For Each cell In pt.DataBodyRange.Cells 
    With cell 
     varResult = Application.Index(varText, Application.Match(.Value2, varNumeric, 0)) 
     If Not IsError(varResult) Then 
      cell.Value2 = varResult 
     Else: 
      If Not IsMissing(varNoMatch) Then cell.Value2 = varNoMatch 
     End If 
    End With 
Next cell 

errHandler: 
If Err.Number > 0 Then 
    If gbDebug Then 
     Stop: Resume 
    Else: 
     MsgBox "Whoops, there was an error: Error#" & Err.Number & vbCrLf & Err.Description _ 
     , vbCritical, "Error", Err.HelpFile, Err.HelpContext 
    End If 
End If 

With Application 
    .ScreenUpdating = bScreenUpdating 
    .EnableEvents = bEnableEvents 
    .Calculation = lngCalculation 
End With 


End Function 

Ed ecco il risultato: una tabella pivot con il testo nella zona VALORI:

enter image description here

Ecco la tabella di 'conversione' che dice il codice cosa visualizzare per ogni numero:

enter image description here

ho assegnato due intervalli denominati a questi, in modo che il mio codice k nows dove trovare la tabella di ricerca:

  • tbl_PivotValues.TextValue
  • tbl_PivotValues.NumericValue

... ed ecco come ho attivare la funzione e passare gli argomenti richiesti:

Option Explicit 

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) 

If Target.Name = "GroupView" Then Pivots_TextInValuesArea Target, [tbl_PivotValues.NumericValue], [tbl_PivotValues.TextValue] 

End Sub 

Questo codice va nel modulo del codice del foglio di lavoro che corrisponde al foglio di lavoro in cui si trova la tabella pivot:

enter image description here

+0

Grazie, ma, se ho capito bene, sembra che la mia idea di aggiungere una colonna numerica con numeri univoci, creando un pivot per mostrare il minimo (o il massimo, o la somma, o la media, è lo stesso), e poi facendo una ricerca recuperare il testo associato a ciascun numero è quasi identico ma meno complicato in quanto non implica alcun hacking VBA. Probabilmente starò meglio a farlo in Python ogni volta che posso: è solo un comando a una riga! Va a dimostrare quanto sia scarso Excel nell'analisi e nella manipolazione dei dati ... –

+0

@jeffreyweir Dove si esegue questo codice? L'ho messo in un modulo ma non funziona. Ottiene automaticamente il nome pivotabile? – jjjjjjjjjjj

+0

Questa è una funzione che deve essere chiamata da un'altra routine. – jeffreyweir

1

Per i lettori futuri - utilizzare due funzioni insieme:

Nastro> Strumenti tabella pivot> Rapporto Layout> Visualizza in forma tabellare

e

Nastro> Strumenti tabella pivot> Report Layout> Ripeti tutte le etichette elementi

I campi di riga verranno presentati da sinistra a destra come testo ripetuto verticalmente.