このようなデータがあります。
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でこれを行う最も簡単な方法は何ですか?
あなたはピボットテーブルでこれを行うことができます。
ピボットテーブル内のすべてのデータを含む新しいシートが、探しているとおりに転置されているはずです。
Datapig技術は 段階的な指示 を提供します - 実際にはあなたが必要とするよりも複雑です - 彼の例はデータセットの一部のみを転置し& TextToColumnsと組み合わせたピボット技術を使用します。しかし、それはたくさんの写真を持っています。
ピボットテーブルがデータをグループ化することに注意してください。グループ化したくない場合は、ピボットテーブルをコピーして値として "specialを貼り付ける"ことが唯一の方法です。あなたはそれからこのようなテクニックで空白を埋めることができます。 http://www.contextures.com/xlDataEntry02.html
データが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
私はあなたにそれを可能にするアドインを作りました、そしてそれはそれが異なった状況に適応するのを簡単にします。ここでそれをチェックしてください。 http://tduhameau.wordpress.com/2012/09/24/the-unpivot-add-in/
Excel 2010には非常に優れた解決策があります。ピボットテーブルを少しだけ使用する必要があります。
これらの設定でデータからピボットテーブルを作成します。
私がこれまでに思い付いたのはこれが一番です。
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を手動で生成する必要があります。もっと自動化された解決策がある場合(マクロを書く以外に)、別の答えで私に知らせてください。
データのディメンションが質問で提供されているサンプルのようになっている場合は、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で、言う。
その後、必要に応じてこれらの式をコピーします。
これは私が考えることができる最も簡単で、純粋で、内蔵のフォーミュラソリューションです。
あなたは "loc"コラム(あなたの最初の答えによって証明される)を得たようです、そして今あなたは他の二つのコラムを手に入れるのを手助けする必要があります。
最初の選択肢は、最初の数行(たとえば12行)をそれらの列に入力してから下にドラッグすることです。この場合、Excelが正しいことを行うと思います(このコンピューターには確実にテストできるExcelがありません)。
それでもうまくいかない場合、あるいはもっとプログラマが欲しい場合は、row()関数を使ってみてください。 ID列には "= Floor(row()/ 4)"、LocNum列には "= mod(row()、4)+1"のようなものです。
ピボットデータをアンピボットまたはリバースしてデータベーステーブルに戻すためのパラメトリックVBA変換ユーティリティがあります。
@DaveParilloという回答は、単一のタブテーブルに対する最良の回答です。ここにいくつかの追加機能を追加したいと思いました。
複数列の場合、アンピボット列の前に
この方法は機能しません。
YouTubeは質問のような単純なデータのピボットを解除します
これは簡単な方法でそれをする方法を示すYouTubeのビデオです。私はショートカットを追加することについての部分をスキップして、DaveParillo答えにある@devuxerショートカットを使いました。