2015-09-24 1 views
8

だが、私はこのようなテーブルがあるとしましょう:数字ではなくテキストを表示するために、集計なしでExcelでピボットする?

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

私はExcelでこのようなピボットを入手するにはどうすればよいですか?

Country North   South 
USA  a    b 
Brasil c    d 

「MYTEXT」は数だったら、私はピボットテーブルを行うことができます:1行だけの国と地域の組み合わせごとがあるので、最小=最大=合計=平均及びこれらの集計関数のいずれかだろう、実際には、私が望む結果を見せてください。

しかし、私が望むフィールドが数字以外の場合はどうなりますか? Pythonのpandasライブラリでは、非数値フィールドでもdataframe.pivot()メソッドを使用できますが、Excelで同じように行う方法は見つかりませんでした。私は各行に数値を関連付けることができ、その番号を表示するためにExcelでピボットを行い、関連するテキストを取得するためにルックアップを実行することができますが、

+0

[タイトルにタグを使用する必要がありますか?](http://meta.stackexchange.com/help/tagging)を参照してください。 – pnuts

+3

私はあなたの編集に正直に同意しません。私のタイトルを編集したのは、質問がExcel、SQL、または利用可能なソフトウェアや言語のどれかを指しているのかどうかを理解することは不可能です。あなたは「Excel:Pivot」(小柄なものは小さな心を楽しませる)ではなく「Pivot [...]をExcelで書くことができると主張するかもしれませんが、タイトルのExcelを言及することが重要であると確信しています。あまりにもあいまいです。 –

+0

自由にロールバックしてください。しかし、あなたの投稿はタグからのExcelに関するものであり、Titlesの限られたスペースは、75k +他のExcel Qの間ではなく、あなたのQを他の人と区別するのに適しています。つまり、私はあなたのQを際立たせようとしていました - クイック/クオリティーレスポンスのより良いチャンスかもしれませんが、あなたが「ブレンドする」ことを好むなら、それは私のものです。 – pnuts

答えて

5

MS Power Query Add-in *を使用できます。テーブルをピボットすることは、vbaが簡単にできません。これは無料で、データ変換に非常に効果的です。

M-コード

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

あなたの出力 enter image description here

は '* MS Officeの2016年から、それは完全にGet & Transform関数としてExcelで統合されています。将来の読者のために

+0

はPythonとほとんど同じですパンダスnks! –

+2

GUIでこれを行うには:テーブルを選択 - >パワークエリ - >テーブルからデータ - >列 '領域' - >変換 - >ピボット列 - >値列を選択:mytext - >詳細オプション:ドン集約する。元のソースを変更して出力テーブルの更新を右クリックすると、出力がリフレッシュされます。 –

+0

MS Office 2016では、ヘッダーの列が1つ必要です。冗長な列を削除するか、または表がスパースになるようにしてから、ヘッダー列をピボットし、値フィールドを選択し、「集計しない」。 –

3

MyTextを国ラベルの下に行ラベルとして追加し、「ピボットテーブルデザイン」タブの下に表形式のピボットテーブルを表示します。国の行ラベルフィールドの項目ラベルを繰り返します。

+0

少し具体的にできますか?私はそれに従わなかったのではないかと思います。私は表形式で遊んだが、私は必要な出力を得る方法が見当たらない。ありがとう! –

2

これを行うことができますが、ピボットテーブルの数字の「プレースホルダ」値をテキストで一時的に上書きする必要があります。これを有効にするには、ピボットテーブルに対してEnableDataValueEditing = Trueを設定する必要があります。リフレッシュ時には、数値のプレースホルダ値を検索し、テキストで置き換えます。畳んだ、はい。回避策、はい。しかしそれはトリックです。ピボットテーブルが次にリフレッシュされるまでこれが「スティック」するだけであるため、このコードはすべてのリフレッシュ時にトリガされる必要があります。

私が自分のプロジェクトでこれを行うために使用するコードは次のとおりです。標準コードモジュールでこれを入れて:

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 

そして、ここではその結果です:VALUESエリア内のテキストを持つピボットテーブル:

enter image description here

はここで何にコードを告げる「変換」テーブルです各番号の表示:

enter image description here

私のコードkのように私は、これらの2つの名前付き範囲が割り当てられていますNOWSルックアップテーブルを検索するには:

  • tbl_PivotValues.TextValue
  • ここtbl_PivotValues.NumericValue

...と私は機能を起動し、必要な引数を渡す方法は次のとおりです。

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 

このコードは、ワークシートコードモジュールにあり、ピボットテーブルがあるワークシートに対応しています。

enter image description here

+0

ありがとうございますが、私が正しく理解していれば、数字の列に一意の数値を追加し、ピボットを作成して最小値(または最大値、合計値、または平均値)を表示してから検索します各番号に関連付けられたテキストを取得するには、ほとんど同じですが、VBAのハッキングが含まれていないため、あまり複雑ではありません。私はたぶんPythonでそれをやるほうがいいでしょう:それは単なる1行のコマンドです! Excelがデータ分析と操作にどれほど貧弱であるかを示します。 –

+0

@jeffreyweirこのコードはどこで実行しますか?私はそれをモジュールに入れましたが、実行されません。ピボット可能な名前が自動的に得られますか? – jjjjjjjjjjj

+0

これは別のルーチンによって呼び出されなければならない関数です。 – jeffreyweir

1

- 二つの特徴を一緒に使用します。

リボン>ピボットテーブルツール]> [レポートレイアウト>

リボン> [ピボットテーブルツール]表形式で表示>レポートレイアウト]> [すべてのアイテムのラベルを繰り返し

行フィールドは、縦書きの繰り返しテキストとして左から右に表示されます。

関連する問題