縦もちデータ(マトリクス)をデータベースで使えるようにマクロで4列になるように成型処理 

縦もちデータ(マトリクス)をデータベースで使えるようにマクロで4列になるように成型処理

動画編 入門編EX08回
データ1件が4行で1列にずらずら続く縦もちデータ

動画でExcel データ1件が4行で1列にずらずら続く縦もちデータ

データ1件が4行で1列にずらずら続く縦もちデータ

動画版「マクロ講座入門EX」08回の解説です。

  • 【動画で解説している内容】
  • 1.不規則なデータの整形方法を学ぶ。
  • 2.VBAマクロを使用してデータを4列に整理する方法を学ぶ。
  • 3.手作業でデータ整形する時間を削減する方法を学ぶ。
  • 4.古いデータ形式を現代のデータベース形式に変換する方法を学ぶ。
  • 5.VBAコードの基本構文と処理の流れを理解する。
  • 6.データ整形を効率化し、残業を減らす方法を学ぶ。
  • 7.エクセルマクロを活用して、データ操作のスキルを向上させる。

(サンプルファイルは、こちらです。 データ1件が4行で1列にずらずら続く縦もちデータ、サンプル08回

マクロ動画 データ1件が4行で1列にずらずら続く縦もちデータ

https://youtu.be/GXX22bDeCSI

困った縦長データ4行が1件分の縦に長ーいデータ

このようなデータに遭遇したことはないでしょうか?一番上がコードで、 2行目が名前で、3行目がデータで、4行目は電話番号という 4行が1件分のデータなどです。

1件1列4行のデータを1件1行にする1

その縦長データを使いやすい形に整形したデータがこちらになります。

1件1列4行のデータを1件1行にする2

そこで最初の案として、データの移動を考えました。2行目のデータを隣の列のデータにするということです。

1件1列4行のデータを1件1行にする3

上記コードを実行した結果次のようになりました。不要になったデータは削除すればいいのです。

方法はマクロでも、手動でも、どちらにせよデータの件数分の削除が必要です。

1件1列4行のデータを1件1行にする4

見出し3

なぜデータの行を1行分下げたのかというと、1行目に見出しを入れようと考えたからです。こちらには、空白行を削除するコードも書き加えました。

1件1列4行のデータを1件1行にする5

実行しました。最終的に欲しかったのはこの形のデータです。

1件1列4行のデータを1件1行にする1

ではコードの説明に移ります。今回は、説明がしやすくなるように、変数i, jを日本語の行と列に変更することにします。

1件1列4行のデータを1件1行にする2

始めのコードでは、最初の行のデータA2は、同じ行の同じ列に移動、次の行のデータは、上の行の一つ隣の列に移動します。

1件1列4行のデータを1件1行にする3

図にすると、なんだか無駄なことをしているように思えます。A2のデータをもとのA2の位置に移動するという動作です。

1件1列4行のデータを1件1行にする4

これではあとの行削除が面倒だと考えて、このようなコードに変更しました。
データはB列からE列に移動する方が綺麗です。

1件1列4行のデータを1件1行にする5

1件1列4行のデータを1件1行にするコードを実行

実行後のデータはこのようになります。結果は変わりませんが。

1件1列4行のデータを1件1行にする1

全体のコードです。ポイントは移動は横への列移動だけでなく、上への行移動と横への列移動を組み合わせたということです。
このようなことが簡単にできるのは、Cells(行,列)という書きかたがあるからです。

Option Explicit
    Dim 行 As Long, 列 As Long, lastRow As Long

Sub データ成型4行から1行に()
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For 行 = 2 To lastRow Step 4
        For 列 = 0 To 3
            Cells(行, 列 + 2) = Cells(行 + 列, 1)
        Next 列
    Next 行
    ' A列のデータを削除
    Columns("A:A").Select
    Selection.Delete Shift:=xlToLeft
    ' 空白行を削除
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For 行 = lastRow To 2 Step -1
        If WorksheetFunction.CountA(Rows(行)) = 0 Then
            Rows(行).Delete
        End If
    Next 行
End Sub
1件1列4行のデータを1件1行にする2