webdevqa.jp.net

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

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

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でこれを行う最も簡単な方法は何ですか?

65
devuxer

あなたはピボットテーブルでこれを行うことができます。

  1. 「複数の連結範囲ピボットテーブル」を作成します。 (ピボットテーブルウィザードでのみ。 ALT+D、 P Excel 2007の場合)
  2. 「自分のページフィールドを作成します」を選択します。
  3. あなたのデータを選択してください。
  4. ピボットテーブルの右下隅にあるRow GrandColumn Grandの交点の合計値をダブルクリックします。

ピボットテーブル内のすべてのデータを含む新しいシートが、探しているとおりに転置されているはずです。

Datapig技術は 段階的な指示 を提供します - 実際にはあなたが必要とするよりも複雑です - 彼の例はデータセットの一部のみを転置し& TextToColumnsと組み合わせたピボット技術を使用します。しかし、それはたくさんの写真を持っています。

ピボットテーブルがデータをグループ化することに注意してください。グループ化したくない場合は、ピボットテーブルをコピーして値として "specialを貼り付ける"ことが唯一の方法です。あなたはそれからこのようなテクニックで空白を埋めることができます。 http://www.contextures.com/xlDataEntry02.html

69
DaveParillo

データがExcelピボットテーブルではなく単なるデータである場合は、単純なVBAコードを使用してデータを「ピボット解除」することをお勧めします。コードは、SourceとTargetという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
6
TJMelrose

私はあなたにそれを可能にするアドインを作りました、そしてそれはそれが異なった状況に適応するのを簡単にします。ここでそれをチェックしてください。 http://tduhameau.wordpress.com/2012/09/24/the-unpivot-add-in/

5
nutsch

Excel 2010には非常に優れた解決策があります。ピボットテーブルを少しだけ使用する必要があります。

これらの設定でデータからピボットテーブルを作成します。

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

私がこれまでに思い付いたのはこれが一番です。

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を手動で生成する必要があります。もっと自動化された解決策がある場合(マクロを書く以外に)、別の答えで私に知らせてください。

3
devuxer

データのディメンションが質問で提供されているサンプルのようになっている場合は、OFFSETを使用した次の一連の式によって、必要な結果が得られます。

想定して

1 | NY | CA | TX |イリノイ州

2 | WA | OR | NH | RI

a2:E3の範囲内にある場合は、

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

f2では、そして

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

g2では、と言う、そして

= OFFSET($ B $ 2、フロア((行(B2) - 行($ B $ 2))/ 4,1)、MOD(行(A2) - 行($ A $ 2)、4))

h2で、言う。

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

これは私が考えることができる最も簡単で、純粋で、内蔵のフォーミュラソリューションです。

2
Aaa

あなたは "loc"コラム(あなたの最初の答えによって証明される)を得たようです、そして今あなたは他の二つのコラムを手に入れるのを手助けする必要があります。

最初の選択肢は、最初の数行(たとえば12行)をそれらの列に入力してから下にドラッグすることです。この場合、Excelが正しいことを行うと思います(このコンピューターには確実にテストできるExcelがありません)。

それでもうまくいかない場合、あるいはもっとプログラマが欲しい場合は、row()関数を使ってみてください。 ID列には "= Floor(row()/ 4)"、LocNum列には "= mod(row()、4)+1"のようなものです。

1
Roie Marianer

これは、ピボットテーブルをアンピボット、正規化するための素晴らしいツールです。

通常のピボットTabellen

助けになれば幸いです。

1
L4a-Thompson

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

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

1
Petros

@DaveParilloという回答は、単一のタブテーブルに対する最良の回答です。ここにいくつかの追加機能を追加したいと思いました。

複数列の場合、アンピボット列の前に

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

YouTubeは質問のような単純なデータのピボットを解除します

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

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

1
BrinkDaDrink