ecoslymeです。
エクセル(Excel)のデータで、横持ち(推移表・マトリクス表)になっているデータを縦持ちにしたいと思っている方は多くいるのではないでしょうか。
データの横持ちとか、縦持ちのイメージがよく分からないと思いますので、下の例をご覧になってください。
データは縦持ちの方が汎用性が高いデータの加工ができます。
ピボットテーブルへ変換することが出来ますし、全ての値に数式を反映させていく加工も出来ます。
当記事でダウンロード出来るエクセルマクロファイルで、以下のタイプの表をピボットテーブルで集計しやすい形に変換します。
・横持ちデータ ⇨ 縦持ちデータ
・推移表、クロス集計表、マトリクス表 ⇨ リストタイプ、リスト型
・エクセルで作成したテーブル ⇨ 元の表
この記事でエクセルマクロファイルをダウンロードできますので、ダウンロードしたエクセルファイルにご自分の表を貼り付ければ、すぐに縦持ちのデータが作成できます。
※記事の最後の方でエクセルマクロのダウンロードができます
元データと結果
<横持ちのデータ①>
⇓
<縦持ちのデータ①>
<横持ちのデータ(列項目が複数)②>
⇓
<縦持ちのデータ②>
横持ちのデータと縦持ちのデータについて
それではまず、横持ちのデータと縦持ちのデータがどのようなものか説明します。
横持ちのデータとは、表の左側が不変の列項目(Tableauというシステムでは、”ディメンション“と言います)で、表の右側が値(Tableauというシステムでは”メジャーバリュー“と言います)になります。
この概念については理解していてください。
以下のデータが横持ちのデータです。(基本的に行の項目(年月)は1つの場合を考えています)
(横持ちのデータ:列項目(会社名)1つ)
(横持ちのデータ:列項目(会社名、支店名)2つ)
いわゆる、”推移表“とか”マトリクス表“と言われているデータです。
初めからこのデータであれば、ピボットテーブルを作成することが出来ません。
また、この横持ちのデータの持ち方の場合、前月比などの数式をうまく入力することが出来ません。
次にいきます。
以下のデータが縦持ちのデータです。
(縦持ちのデータ)
(縦持ちのデータ)
このデータの持ち方であれば、いかようにでもデータを加工することが出来ます。
ピボットテーブルの形式にすることが出来ます。
また、D列などに数式を入れて、好きなデータを抽出することも可能でしょう。ピボットテーブルで数式をいじることも可能です。
つまり、横持ちのデータは縦持ちのデータに変換する方が便利であることが分かると思います。
横持ちのデータを縦持ちのデータに変換する方法(列項目1つ)
それでは早速、横持ちのデータを縦持ちのデータに変換してみましょう。
「ピボットテーブル/ピボットグラフ ウィザード」を利用します。
※MacではExcel 2011のバージョンでないと利用出来ないようです
「Alt+D」+「P」と入力してください。
すると、「ピボットテーブル/ピボットグラフ ウィザード」の画面が開きます。
以下のように設定してください。
- 分析するデータのある場所 :複数のワークシート範囲
- 作成するレポートの種類 :ピボットテーブル
- 「指定」を選択してから、次へをクリック
- 結合するワークシートの範囲 :表を選択(例ではA1〜D4セル)
※「範囲」の右にある「↑」をクリックすれば、範囲を簡単に指定できます
- 「追加」ボタンをクリック
- 「次へ」ボタンをクリック
- ピボットテーブルレポートの作成先 :新規ワークシート
- 「完了」ボタンをクリック
ワークシートが追加されており、ピボットテーブルの形式になっています。
このピボットテーブルの一番右下の数字(総計と総計のクロスした数字:1390)をダブルクリックします。
データが縦持ちへと変換されます。
項目名が、「行」、「列」、「値」となってしまっているので、名前を変更しましょう。
以上で、横持のデータを縦持ちのデータへ変換することが出来ました。
しかし、上で説明した横持のデータを縦持ちのデータへ変換する方法は、列項目(ディメンション)が1つの場合に限られます。
横持ちのデータを縦持ちのデータに変換する方法(列項目複数)
列項目(ディメンション)が複数ある場合について説明します。
列項目が複数とは、以下のように「会社名」、「支店名」と項目が複数あるデータの状態のことを言っています。
少し特殊なことをします。
マクロを利用します。
マクロが初めての方も以下の方法に沿って行けば問題なくできますので、ご安心ください。
大前提として、以下の図のように「開発」タブに「マクロ」があることをご確認下さい。
(開発タブに「マクロ」の項目があることが大前提)
もし、ご自分のエクセルのに「開発」タブが無かったり、「マクロ」が無ければ、以下の記事をご覧頂き、マクロを利用できる状態にして下さい。
ecoslymeです。 エクセル(Excel)のマクロと聞くと変に抵抗感を持っている人は多いのではないでしょうか? システムに詳しい人でないと無理とか、関数や言語が意味不明とか思う気持ちは[…]
マクロの設定
それでは、マクロの設定を行います。
以下の手順に沿って進めていって下さい。
- エクセルの画面で、「Alt+F11」を押して下さい。
以下の「Microsoft Visual Basic for Applications」、通称VBAの画面が出てきたと思います。
- 挿入から標準モジュールを選択して下さい。
- 下の画面が出てきますので、以下のコードをコピペして下さい。
<以下のコードをコピーして、先に出てきた画面の空白部分に貼付して下さい>
※マクロがうまく実行できない場合は、赤文字の行の “-“ の部分が “?” になってしまっていないか確認してください
Sub 横持ちデータを縦持ちデータに変換する()
Dim table As Range
Dim cross As Range
Dim majorvalue As Range
If Selection.Cells.Count > 1 Then
Set cross = Selection.Cells
Set table = Range(cross.CurrentRegion.Cells(1, 1), cross.Cells(cross.Rows.Count, cross.Columns.Count))
Else
Set table = ActiveCell.CurrentRegion
Set cross = Range(ActiveCell, table.Cells(table.Rows.Count, table.Columns.Count))
cross.Select
End If
If table.Row = cross.Row Or table.Column = cross.Column Then
Beep
Exit Sub
End If
Application.ScreenUpdating = False
Application.EnableEvents = False
Set majorvalue = ActiveWorkbook.Worksheets.Add.Range(“A1”)
conversionlist table, cross, majorvalue
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Sub conversionlist(srcTable As Range, srcCross As Range, dstdatalist As Range)
Dim row1 As Integer
Dim column1 As Integer
Dim value1 As Integer
row1 = srcCross.Column – srcTable.Column
column1 = srcCross.Row – srcTable.Row
value1 = srcCross.Columns.Count
Dim value6 As Range
Dim value7 As Range
With srcCross
Set value6 = .Offset(0, -row1).Resize(, row1)
Set value7 = .Offset(-column1, 0).Resize(column1)
End With
Dim value2 As Range
Dim value3 As Range
Dim value4 As Range
With dstdatalist.Cells(1, 1)
Set value2 = .Offset(0, 0).Resize(value1, row1)
Set value3 = .Offset(0, row1).Resize(value1, column1)
Set value4 = .Offset(0, row1 + column1).Resize(value1, 1)
End With
Dim value5 As Variant
value5 = WorksheetFunction.Transpose(value7.Value)
Dim srcLine As Range
For Each srcLine In srcCross.Rows
value2.Value = value6.Rows(1).Value
value3.Value = value5
value4.Value = WorksheetFunction.Transpose(srcLine.Value)
Set value2 = value2.Offset(value1, 0)
Set value3 = value3.Offset(value1, 0)
Set value4 = value4.Offset(value1, 0)
Set value6 = value6.Offset(1, 0)
Next
conversionblank Range(dstdatalist.Cells(1, 1), value3.Rows(1).Offset(-1, 0))
End Sub
Private Sub conversionblank(rng As Range)
Dim blanks As Range
If rng.Cells.Count > 1 Then
On Error Resume Next
For Each blanks In rng.SpecialCells(xlCellTypeBlanks).Areas
If blanks.Row > 1 Then
blanks.Value = blanks.Rows(1).Offset(-1, 0).Value
End If
Next
On Error GoTo 0
End If
End Sub
- 貼付が終わったら、画面左上の方にある保存ボタンをクリックして、コードを保存しましょう。(コードを保存しないとマクロが実行できません)
- 以下のポップアップが表示されますが、「はい」を選択すれば問題ありません。
その後、VBAの画面を閉じてから、エクセルの画面へ戻って下さい。
マクロの実行
それでは、マクロの設定が終わったところで、「横持ちデータを縦持ちデータに変換する」マクロを実行していきます。
- カーソルをメジャーバリュー(値)の一番左上に持ってきてください。(今回の例ではC2セル)
- 「開発」タブから「マクロ」をクリックすると、先程作成したマクロの名前が表示されます。
- 後は実行ボタンをクリックすればほぼ完成です。
- 1行目に行項目を追記して完成させていきましょう。
以上で完成です。
なお、空白行や値が”0″(売上が0)の行を削除したい場合は、D列でフィルタを行い、値が”空白”、”0″をチェックしてから行の削除を行えば良いです。
「横持ちデータを縦持ちデータへ変換」マクロのダウンロード
「横持ちデータを縦持ちデータへ変換」マクロのダウンロードをしたい方は、以下のリンクをクリックしてください。
エクセルでダウンロードが可能です。
<マクロ>
【ダウンロード】matrix-conversion-macro
最後に
いかがでしたでしょうか。
誰かからデータをもらった時にすでにピボットテーブル形式(横持ちデータ)となっていて、そのデータを加工することが手間になっていることはありませんか?
この方法を使えば、うまいことデータを縦持ちにすることが出来て、その後の加工が楽になります。
知っておいて損は無い手法なので、ぜひ覚えて行ってください。
無駄なデータ加工に時間を割かないようにしましょう。
エクセル技術習得のススメ
エクセルを仕事で主に利用する方は、是非ご覧ください。
仕事時間の大幅短縮が可能になります。
エクセル技術習得にオススメの本
エクセルの技術を習得するのに非常にオススメの本をご紹介します。
手元に1冊あって損はない本です。
仕事効率が劇的に改善します。
パソコン講座
エクセルに技術力の資格があるのはご存知ですか?
MOS(Microsoft Office Specialist)と言いますが、社会的に非常に評価されている資格です。
資格を取得すれば社内で評価されることはもちろん、転職でも評価される場合があります。
ご興味ある方は以下の講座を受講してみてはいかがでしょうか。
<ヒューマンアカデミー>
MOSのテキストと問題集です。
マクロ
マクロを学びたい方は以下の参考書が非常に便利です。
本は太いですが、非常に広い範囲を網羅しています。紙の本の購入をオススメします。
エクセル勉強サイト
経理で利用するエクセルを学べるサイトをご紹介します。
初月無料で経理の仕事に役立つ150以上の動画が学べるサイト【Accountant’s library】