実務で使えるPower Query小技・テクニック | テーブルを作る

Excel VBA Power Query M Formula Language
スポンサーリンク
スポンサーリンク

テーブルを作るとは何か

Power Query(M言語)で「テーブルを作る」とは、行と列を持つ“表形式データ”をコードから直接定義することです。 通常は ExcelやCSVなどから読み込みますが、実務では「小さな設定テーブル」「マスタの簡易版」「テスト用データ」などを、Mコードの中で手作りしたい場面がよくあります。 ここでは、初心者向けに「テーブルをゼロから作る方法」をステップバイステップで解説していきます。

M言語でのテーブルの基本構造

テーブルは「列名のリスト」+「行のリスト」でできています

M言語でテーブルを手作りするときの基本構文は次の通りです。

let
    MyTable =
        #table(
            {"顧客コード", "顧客名", "売上金額"},   // 列名のリスト
            {
                {"C001", "山田商事", 120000},       // 1行目
                {"C002", "佐藤工業", 80000},        // 2行目
                {"C003", "鈴木商店", 50000}         // 3行目
            }
        )
in
    MyTable
Power Query

ポイントは2つです。

  • 1つ目の引数:列名のリスト({"顧客コード", "顧客名", "売上金額"}
  • 2つ目の引数:行のリスト(各行はさらにリストで表現)

この #table 関数が、M言語でテーブルを手作りするときの基本ツールになります。

テーブルをステップバイステップで作る

ステップ1:列名のリストを作る

まず、「どんな列を持つテーブルにしたいか」を決めます。

例:顧客マスタの簡易版を作りたい場合

let
    ColumnNames = {"顧客コード", "顧客名", "ランク"}
in
    ColumnNames
Power Query

この ColumnNames が、テーブルの「ヘッダー」に相当します。

ステップ2:行データのリストを作る

次に、各行をリストとして定義します。

let
    Rows =
        {
            {"C001", "山田商事", "A"},
            {"C002", "佐藤工業", "B"},
            {"C003", "鈴木商店", "C"}
        }
in
    Rows
Power Query

ここでは、

  • 1行目:{"C001", "山田商事", "A"}
  • 2行目:{"C002", "佐藤工業", "B"}
  • 3行目:{"C003", "鈴木商店", "C"}

という形で、各行を「列順に並べたリスト」として表現しています。

ステップ3:#table でテーブルにする

列名リストと行リストを組み合わせて、テーブルを作ります。

let
    ColumnNames = {"顧客コード", "顧客名", "ランク"},

    Rows =
        {
            {"C001", "山田商事", "A"},
            {"C002", "佐藤工業", "B"},
            {"C003", "鈴木商店", "C"}
        },

    CustomerTable =
        #table(ColumnNames, Rows)
in
    CustomerTable
Power Query

これで、3列3行の顧客マスタテーブルが完成します。

このテーブルは、通常の読み込みテーブルと同じように、 Table.SelectRowsTable.Join などの関数で扱うことができます。

型を意識したテーブル作成

列の型を後から明示的に指定する

#table で作ったテーブルは、列の型が「推測」に頼られることが多くなります。 実務では、列の型を明示的に指定することが品質・セキュリティの観点からも重要です。

let
    ColumnNames = {"顧客コード", "顧客名", "売上金額"},

    Rows =
        {
            {"C001", "山田商事", 120000},
            {"C002", "佐藤工業", 80000},
            {"C003", "鈴木商店", 50000}
        },

    RawTable =
        #table(ColumnNames, Rows),

    TypedTable =
        Table.TransformColumnTypes(
            RawTable,
            {
                {"顧客コード", type text},
                {"顧客名", type text},
                {"売上金額", type number}
            }
        )
in
    TypedTable
Power Query

ここでは、

  • 顧客コード・顧客名:type text
  • 売上金額:type number

と明示的に指定しています。

型をきちんと決めておくことで、

  • 計算時のエラーを防げる
  • 比較やソートの挙動が安定する
  • 後続処理の意図が明確になる

といったメリットがあります。

レコードからテーブルを作る

レコードのリストをテーブルに変換する

レコードを使ってテーブルを作る方法もあります。

let
    Records =
        {
            [顧客コード = "C001", 顧客名 = "山田商事", 売上金額 = 120000],
            [顧客コード = "C002", 顧客名 = "佐藤工業", 売上金額 = 80000],
            [顧客コード = "C003", 顧客名 = "鈴木商店", 売上金額 = 50000]
        },

    CustomerTable =
        Table.FromRecords(Records)
in
    CustomerTable
Power Query

この方法のメリットは、 「列名と値の対応が視覚的に分かりやすい」ことです。

#table では列順を間違えるとバグになりますが、 レコード形式なら「顧客コード = …」「顧客名 = …」と書くので、 読みやすさ・保守性が高くなります。

テーブルを作るときの重要な注意点

1. 列順と行の値の対応を間違えない

#table を使う場合、 列名リストと行のリストの「順番」が一致していないと、 列と値の対応が崩れてしまいます。

悪い例:

ColumnNames = {"顧客コード", "顧客名", "売上金額"},
Rows = {{"山田商事", "C001", 120000}}   // 順番が逆
Power Query

この場合、

  • 顧客コード列に「山田商事」
  • 顧客名列に「C001」

というおかしなテーブルになってしまいます。

列順と行の値の順番は必ず一致させることが重要です。

2. テスト用テーブルと本番データを混同しない

手作りテーブルは、テストや検証に非常に便利ですが、 本番クエリに残したままにすると、

  • 実データではなくテストデータを使ってしまう
  • 誤った集計結果を本番に流してしまう

といったリスクがあります。

そのため、

  • テスト用テーブルには分かりやすい名前を付ける(例:SampleSalesTable
  • 本番用クエリとテスト用クエリを分ける
  • コメントで「これはテスト用」と明示する

といった工夫が重要です。

3. セキュリティの観点からのテーブル

手作りテーブルに、

  • ユーザーID
  • ロール(権限)
  • 内部ルール

などを埋め込む場合は、 誰がそのコードを編集できるかを意識する必要があります。

例:

let
    RoleTable =
        #table(
            {"UserId", "Role"},
            {
                {"U001", "Admin"},
                {"U002", "Manager"},
                {"U003", "Viewer"}
            }
        )
in
    RoleTable
Power Query

このようなテーブルを使って権限判定を行う場合、 誤ってテーブルを変更すると、 本来許可されていないユーザーが操作できてしまうリスクがあります。

権限情報やセキュリティ関連のテーブルは、

  • 編集権限を限定する
  • 変更履歴を管理する
  • 必要なら外部システム側に寄せる

といった設計レベルの配慮も検討すべきです。

実務で使える「テーブル作成テンプレート」

テンプレ1:簡易マスタテーブル

let
    ColumnNames = {"顧客コード", "顧客名", "ランク"},

    Rows =
        {
            {"C001", "山田商事", "A"},
            {"C002", "佐藤工業", "B"},
            {"C003", "鈴木商店", "C"}
        },

    RawTable =
        #table(ColumnNames, Rows),

    TypedTable =
        Table.TransformColumnTypes(
            RawTable,
            {
                {"顧客コード", type text},
                {"顧客名", type text},
                {"ランク", type text}
            }
        )
in
    TypedTable
Power Query

テンプレ2:設定値テーブル

let
    ColumnNames = {"項目名", "値"},

    Rows =
        {
            {"TaxRate", 0.1},
            {"DiscountRate", 0.05},
            {"HighAmountThreshold", 1000}
        },

    SettingsTable =
        #table(ColumnNames, Rows)
in
    SettingsTable
Power Query

テンプレ3:レコードからテーブルを作る

let
    Records =
        {
            [顧客コード = "C001", 顧客名 = "山田商事", 売上金額 = 120000],
            [顧客コード = "C002", 顧客名 = "佐藤工業", 売上金額 = 80000],
            [顧客コード = "C003", 顧客名 = "鈴木商店", 売上金額 = 50000]
        },

    CustomerTable =
        Table.FromRecords(Records)
in
    CustomerTable
Power Query

まとめ:テーブルを作ることは「構造化されたデータを自分で設計すること」

M言語でテーブルを作るというのは、 「列名と行データを自分で定義し、構造化された表を設計すること」です。

これによって、

  • 簡易マスタや設定値をコード内で管理できる
  • テスト用データを柔軟に用意できる
  • テーブル関数(フィルタ・結合・集計)をフルに活用できる
  • セキュリティや業務ルールを表形式で明示できる

というメリットが得られます。

テーブルは Power Query の中心的なデータ構造ですので、 ぜひ「#table で作る」「列名リスト+行リスト」「型を明示する」という基本パターンを押さえて、 実務で使えるテーブル設計の感覚を身につけていただきたいです。

タイトルとURLをコピーしました