Excelで「ピボット解除」または「リバースピボット」する方法


66

次のようなデータがあります。

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

そして、これをこれに変換したい:

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

Excel 2007でこれを行う最も簡単な方法は何ですか?


1
困惑

回答:


69

これを行うには、ピボットテーブルを使用します。

  1. 「複数の統合範囲ピボットテーブル」を作成します。(ピボットテーブルウィザードのみ。Excel2007でALT+ Dを使用Pした呼び出し)
  2. 「独自のページフィールドを作成します」を選択します。
  3. データを選択します。
  4. 総計値をダブルクリックします。これは、ピボットテーブルの右下隅にある行の総計と列の総計の交点にあります。

ピボットテーブル内のすべてのデータを含む新しいシートが表示され、探しているように転置されます。

Datapigテクノロジーは、実際には必要以上に複雑なステップバイステップの指示を提供します。この例では、データセットの一部のみを置き換えTextToColumnsと組み合わせたピボットテクニックを使用しています。しかし、たくさんの写真があります。

ピボットテーブルはデータをグループ化することに注意してください。グループ化を解除したい場合、それを行う唯一の方法は、ピボットテーブルをコピーし、値として「特殊貼り付け」を行うことです。その後、次のような手法で空白を埋めることができます。http//www.contextures.com/xlDataEntry02.html


あなたの答えをありがとう。私の質問の例では、行ラベル、列ラベル、値、およびレポートフィルターに何を使用しますか?
devuxer 2009

Idを行ラベルに、Loc1からLoc4を列ラベルに入れてから、右下のセル(総計の交差点)をクリックすると、新しいシートとテーブルが作成されますが、それは望みのものではありません。基本的には、通常のピボットテーブルの単なるコピーです。
devuxer 2009

すみません-重要なデータを省きました。この場合、統合するものは何もありませんが、ピボットテーブル「複数の統合範囲」タイプのピボットテーブルである必要があります。
DaveParillo

4
ああ、ヘルプで調べて、Excel 2007で古いピボットテーブルウィザードを取得するバックドアの方法を見つけました(ALT + D + Pを押す必要があります)。今、私はあなたの手順に従うことができ、それはうまくいくようです。ご協力いただきありがとうございます!
devuxer 09

1
正確な方法は次のとおりです。stackoverflow.com
questions / 32115219

7

データがExcelピボットテーブルではなく、単なるデータである場合は、いくつかの単純なVBAコードで「ピボット解除」することができます。コードは、ソースとターゲットの2つの名前付き範囲に依存します。ソースは、ピボットを解除するデータです(サンプルのNY-RIなど、列/行ヘッダーを除く)。ターゲットは、結果を配置する最初のセルです。

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

1
これをありがとう。例外として動作し、多くの時間を節約できます。
tigrou

ありがとうございました!!これは魔法です!私のために働いたことはありませんアンピボット報告とjigiry-pokeryよりもはるかに優れ
trailmax

1
これはすばらしいように見えますが、私が知る限り、行ヘッダーが1つしかないテーブルに対してのみ機能します。例のテーブルに複数の行ヘッダーがある場合、たとえば、Idフィールドに加えて「SubId」がある場合、これは機能しません。この状況で動作するように変更する簡単な方法はありますか?
クリスストッキング


4

Excel 2010には非常に優れたソリューションがあり、ピボットテーブルで少し遊ぶ必要があります。

次の設定を使用して、データからピボットテーブルを作成します。

  • 小計なし、総計なし
  • レポートレイアウト:表形式、すべてのアイテムラベルを繰り返す
  • 必要なすべての列を追加し、変換する列を右側に保持します
  • 変換する各列に対して:フィールド設定を開く-レイアウトと印刷タブで:[アイテムラベルをアウトラインフォームで表示]を選択し、その下の両方のチェックボックスをオンにします。
  • テーブルを別の場所にコピーします(値のみ)
  • 元のデータに空のセルがある場合は、右端の列の空の値をフィルターし、それらの行を削除します(必要に応じて機能しないため、ピボットテーブルでフィルターしないでください!)

1
2010年以降の場合、これは間違いなく最良の答えであり、インターフェイスではまったく明らかではありません。素晴らしい発見-残念ながら、私はただ1つの賛成票しか持っていません!
jkf

3

私がこれまでに思いついた最高のものはこれです:

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)

これは機能しますが、IDとLocNumを手動で生成する必要があります。(マクロの作成以外に)より自動化されたソリューションがある場合は、別の回答でお知らせください。


2

データのディメンションが質問で提供されているサンプルのとおりである場合、OFFSETを使用する次の一連の数式で必要な結果が得られます。

想定

1 | NY | CA | TX | IL

2 | WA | または NH | RI

範囲A2:E3にあり、入力します

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

F2で言う

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

G2で言う

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

H2で言う。

次に、必要に応じてこれらの式をコピーします。

これは、私が考えることができる最も簡単で純粋な組み込み式のソリューションです。


1

「loc」列を取得したようです(最初の回答で証明されています)。他の2つの列を取得するのに助けが必要です。

最初のオプションは、最初のいくつかの行(たとえば12行)をそれらの列に入力し、下にドラッグすることです-この場合、Excelが正しいことを行うと思います(確かにテストするためにこのコンピューターに優れているわけではありません)。

それがうまくいかない場合、またはもっとプログラマーなものが必要な場合は、row()関数を使用してみてください。ID列の場合は「= Floor(row()/ 4)」、LocNum列の場合は「= mod(row()、4)+1」のようになります。


1

ピボットされたデータをデータベーステーブルにアンピボットまたはリバースするパラメトリックVBA変換ユーティリティがあります。

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


1
スーパーユーザーへようこそ!これは理論的には質問に回答するかもしれませんが、回答の重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
ピーチ

1

ピボットテーブルのピボットを解除して正規化する便利なツールを次に示します。

ピボットタベレンの標準化

役に立てば幸いです。


1
SuperUserへようこそ!リンクしたツールは解決策を提供しますが、この投稿はリンクがアクティブである限り有用です。投稿が今後も引き続き有用であることを確認するには、回答を編集して、質問に記載されている問題を解決するための使用方法など、製品に関する追加情報を含めてください。ありがとう!
Excellll 14

1

@DaveParilloの回答は、単一のタブテーブルのベストアンサーです。ここにいくつかのエキストラを追加したかった。

複数の列の場合、ピボット解除前の列

この方法は機能しません。

Youtubeは質問のような単純なデータをアンピボットします

これは、簡単な方法でそれを行う方法を示すYouTubeビデオです。ショートカットの追加に関する部分をスキップし、DaveParilloの回答にある@devuxerショートカットを使用しました。

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


3
回答の内容は動画へのリンクであり、コンテンツは説明されていません。リンクが壊れているか利用できない場合、回答には価値がありません。回答に重要な情報を含め、帰属とさらなる調査のためだけにリンクを使用してください。
fixer1234

-2

これよりずっと簡単です。「特別貼り付け...」の「トランスポーズ」オプションをクリックするだけで、リクエストしているトランスポーズを取得できます。


1
これは機能しません。
zx8754
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.