ray88’s diary

お仕事で困ったとき用の自分用の覚書

Access 列持ち→行持ち変換・サンプルデータ作成

Access 列持ちデータを行持ちデータへ変換する - ray88’s diary

■列持ちデータのテーブル作成
 ※クエリデザインのSQLビューに入力

CREATE TABLE SalesDataWide (
    Code TEXT,
    [1-4-2022] CURRENCY,
    [1-5-2022] CURRENCY,
    [1-6-2022] CURRENCY,
    [1-7-2022] CURRENCY,
    [1-8-2022] CURRENCY,
    [1-9-2022] CURRENCY,
    [1-10-2022] CURRENCY,
    [1-11-2022] CURRENCY,
    [1-12-2022] CURRENCY,
    [1-1-2023] CURRENCY,
    [1-2-2023] CURRENCY,
    [1-3-2023] CURRENCY
);

■列持ちデータへデータ投入
 ※クエリデザインのSQLビューに入力
  (SQLビューだと1回に1レコードしか投入できないっぽいので2回にわけてデータ投入)

INSERT INTO SalesDataWide (Code, [1-4-2022], [1-5-2022], [1-6-2022], [1-7-2022], [1-8-2022], [1-9-2022], [1-10-2022], [1-11-2022], [1-12-2022], [1-1-2023], [1-2-2023], [1-3-2023])
VALUES ('AAA', 10000, 15000, 20000, 15000, 10000, 20000, 25000, 30000, 20000, 15000, 10000, 25000);
INSERT INTO SalesDataWide (Code, [1-4-2022], [1-5-2022], [1-6-2022], [1-7-2022], [1-8-2022], [1-9-2022], [1-10-2022], [1-11-2022], [1-12-2022], [1-1-2023], [1-2-2023], [1-3-2023])
 ('BAC', 20000, 25000, 30000, 25000, 20000, 30000, 35000, 40000, 30000, 25000, 20000, 35000);

■列持ちデータのテーブル作成
 ※クエリデザインのSQLビューに入力

CREATE TABLE SalesDataLong (
    Code TEXT,
    year_month TEXT,
    amount CURRENCY
);

■行持ちデータへデータ投入
 ※AccessVBAエディタの標準モジュールに入力する想定

Option Compare Database

Sub InsertMultipleRecords()
    Dim db As Database
    Set db = CurrentDb()

    Dim arrData As Variant
    Dim i As Integer

    ' 挿入するデータの配列
    arrData = Array( _
        Array("AAA", "1-Aug-2022", 10000), _
        Array("AAA", "1-Sep-2022", 20000), _
        Array("AAA", "1-Oct-2022", 25000), _
        Array("AAA", "1-Nov-2022", 30000), _
        Array("AAA", "1-Dec-2022", 20000), _
        Array("AAA", "1-Jan-2023", 15000), _
        Array("AAA", "1-Feb-2023", 10000), _
        Array("AAA", "1-Mar-2023", 25000), _
        Array("BAC", "1-Aug-2022", 20000), _
        Array("BAC", "1-Sep-2022", 30000), _
        Array("BAC", "1-Oct-2022", 35000), _
        Array("BAC", "1-Nov-2022", 40000), _
        Array("BAC", "1-Dec-2022", 30000), _
        Array("BAC", "1-Jan-2023", 25000), _
        Array("BAC", "1-Feb-2023", 20000), _
        Array("BAC", "1-Mar-2023", 35000) _
    )

    ' ループを使用して各レコードを挿入
    For i = LBound(arrData) To UBound(arrData)
        db.Execute "INSERT INTO SalesDataLong (Code, year_month, amount) VALUES ('" & _
            arrData(i)(0) & "', '" & _
            arrData(i)(1) & "', " & _
            arrData(i)(2) & ")", dbFailOnError
    Next i

    ' 完了メッセージ
    MsgBox "All records inserted successfully.", vbInformation

    ' オブジェクトのクリーンアップ
    Set db = Nothing
End Sub