テーブルを作るとは何か
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.SelectRows や Table.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 で作る」「列名リスト+行リスト」「型を明示する」という基本パターンを押さえて、 実務で使えるテーブル設計の感覚を身につけていただきたいです。
