実務で使えるPower Query(M言語)小技・テクニック集:列を追加する
Power Queryで「列を追加する」操作は、実務で非常によく使います。売上データに金額列を追加したり、氏名を結合した列を作ったり、条件に応じて判定結果を持つ列を増やしたりと、活用場面はとても広いです。しかも、Power Queryでは一度作った処理を繰り返し再利用しやすいため、毎月・毎週の定型業務を大きく効率化できます。
ただし、初心者のうちは「画面で列を追加できたが、なぜそのコードになるのか分からない」「見た目は数字なのに計算できない」「空欄があると結果がおかしくなる」といったところでつまずきやすいです。そこでこの記事では、Power QueryのM言語で列を追加する考え方を、ステップバイステップでかみ砕いて説明します。単なる操作紹介ではなく、実務で壊れにくく、あとから見ても理解しやすい書き方を重視して解説します。
Power Queryで列を追加するとは何か
列を追加するとは、既存の表に対して、新しい情報を持つ列を作ることです。たとえば、すでに「単価」と「数量」がある表に対して、「金額」という新しい列を追加するのが典型例です。
Excelのワークシート関数では、各セルに数式を書いて下にコピーすることが多いですが、Power Queryでは表全体に対してルールを定義します。つまり「この表の各行について、こういう計算をしてください」という形で処理します。この発想に慣れることが、M言語を理解する第一歩です。
- 既存の列をもとに新しい値を作る
- 各行に同じルールを適用する
- 一度作れば再利用しやすい
- 手作業のコピーミスを減らせる
まず覚えたい基本構文
Power Queryで列を追加するときの代表的な関数は Table.AddColumn です。基本形は次のようになります。
Table.AddColumn(
元のテーブル,
"新しい列名",
each 計算式,
列の型
)Power Queryこの4つの要素を順番に理解すると、かなり読みやすくなります。
元のテーブル:列を追加したい対象の表です"新しい列名":追加後の列名ですeach 計算式:各行ごとに何を計算するかを書きます列の型:結果が文字なのか数値なのか日付なのかを明示します
初心者が特に意識したいのは、each の部分です。これは「各行について」という意味で考えると分かりやすいです。たとえば each [単価] * [数量] と書けば、その行の単価と数量を掛け算するという意味になります。
ステップバイステップで理解する列追加の流れ
ステップ1:何を材料にして新しい列を作るか決める
最初にやるべきことは、「どの列を使って」「何という意味の列を追加したいのか」を明確にすることです。ここが曖昧だと、コードを書き始めても迷いやすくなります。
たとえば次のように考えると整理しやすいです。
- 単価と数量を使って金額を作る
- 姓と名を使って氏名を作る
- 売上日を使って年月を作る
- 売上金額を使って高額フラグを作る
実務では「とりあえず列を足す」のではなく、「後で何に使う列なのか」まで意識しておくことが大切です。分析用なのか、チェック用なのか、レポート表示用なのかで、作るべき列の中身や型が変わるからです。
ステップ2:1行分のルールを日本語で説明する
初心者には特におすすめですが、いきなりMコードを書かず、まずは1行分のルールを日本語で言えるようにすると理解が深まります。
たとえば、金額列なら「その行の単価に数量を掛ける」です。判定列なら「売上が10000以上なら高額、それ以外は通常」です。このように自然言語で説明できる状態になってからコードにすると、式が組み立てやすくなります。
これは実務でも重要です。なぜなら、コードを書くこと自体が目的ではなく、業務ルールを正しくデータ処理に落とし込むことが目的だからです。
ステップ3:Power Queryの画面で追加して、生成コードを見る
初心者のうちは、いきなり詳細エディターに全てを書く必要はありません。まずはPower Queryエディターの「列の追加」メニューからカスタム列を作ってみる方法でも十分です。そのあとで数式バーや詳細エディターを見て、「今の操作がM言語ではこう表現されるのか」と確認するのが学習効率のよい進め方です。
GUI操作とMコードは別物ではありません。画面で行った操作がM言語に変換されて記録されています。この対応関係が見えるようになると、Power Queryの理解が一気に深まります。
ステップ4:型を必ず確認する
列追加で初心者が最もよく失敗する原因のひとつが「型」の問題です。見た目は数字でも、実際には文字列として読み込まれていることがあります。すると掛け算や比較がうまくいきません。
そのため、列を追加する前に、元になる列の型を確認する習慣をつけることが大切です。実務ではこのひと手間が品質を大きく左右します。
- 金額や数量なら数値型を確認する
- 日付なら日付型を確認する
- コードや名称なら文字列型を確認する
- 不明な場合は変換ステップを明示的に入れる
基本例題:単価と数量から金額列を追加する
最も基本的な追加列の例
まずは、実務でも頻出の「単価 × 数量 = 金額」を例に見ていきます。元データに「商品名」「単価」「数量」があり、そこへ「金額」列を追加する想定です。
let
Source = 商品テーブル,
AddedAmount = Table.AddColumn(
Source,
"金額",
each [単価] * [数量], // 各行の単価と数量を掛け算して金額を作る
type number // 金額は数値として扱う
)
in
AddedAmountPower Queryこのコードで押さえたいポイントは、[単価] や [数量] が「その行の列の値」を表していることです。Excelのセル参照のように B2 や C2 とは書きません。列名で考えるのがPower Query流です。
型を整えた安全な実務向けパターン
実務では、読み込んだ直後のデータが必ずしもきれいとは限りません。単価や数量が文字列になっていることもあります。そこで、型変換を先に入れた安全な形をおすすめします。
let
Source = 商品テーブル,
ChangedType = Table.TransformColumnTypes(
Source,
{
{"単価", type number}, // 単価を数値型に変換する
{"数量", Int64.Type} // 数量を整数型に変換する
}
),
AddedAmount = Table.AddColumn(
ChangedType,
"金額",
each [単価] * [数量], // 型変換後の列で計算する
type number
)
in
AddedAmountPower Queryこのように、実務では「列を追加する前に型を整える」という流れを癖にすると安定します。後でエラー調査をするときも、どこで問題が起きたか切り分けしやすくなります。
実務で役立つ列追加パターン
文字列を結合して氏名列を作る
顧客マスタや社員一覧などでは、姓と名を結合して氏名列を作りたいことがあります。このような場合は文字列結合を使います。
let
Source = 顧客テーブル,
AddedFullName = Table.AddColumn(
Source,
"氏名",
each [姓] & " " & [名], // 姓と名をスペースでつなぐ
type text
)
in
AddedFullNamePower Queryただし、この書き方は片方がnullだと結果もnullになりやすいため注意が必要です。実務では欠損データが珍しくないため、null対策を入れたほうが安全です。
let
Source = 顧客テーブル,
AddedFullName = Table.AddColumn(
Source,
"氏名",
each
(if [姓] = null then "" else [姓]) &
" " &
(if [名] = null then "" else [名]), // nullなら空文字に置き換えて結合する
type text
)
in
AddedFullNamePower Query条件に応じた判定列を追加する
売上や在庫の状況に応じてフラグを付ける列は、現場で非常によく使います。たとえば売上金額が10000以上なら「高額」、それ以外は「通常」とする例です。
let
Source = 売上テーブル,
AddedFlag = Table.AddColumn(
Source,
"売上区分",
each if [売上金額] >= 10000 then "高額" else "通常", // 条件で判定する
type text
)
in
AddedFlagPower Queryこのパターンで大切なのは、業務ルールをあいまいにしないことです。「高額」の基準が10000なのか50000なのか、税込なのか税抜なのか、といった条件は先に明確にしておく必要があります。コードより先に業務ルールを確定させることが品質の第一歩です。
日付から年月列を作る
売上日や受注日から年月を取り出して、月次集計に使える列を作るのも定番です。
let
Source = 売上テーブル,
ChangedType = Table.TransformColumnTypes(
Source,
{{"売上日", type date}} // 売上日を日付型にそろえる
),
AddedYearMonth = Table.AddColumn(
ChangedType,
"年月",
each Date.ToText([売上日], "yyyy-MM"), // 2026-10 のような形式で年月を作る
type text
)
in
AddedYearMonthPower Queryここでも型が重要です。文字列のまま日付処理をしようとすると、見た目では分かりにくい不具合が起きることがあります。日付関数を使う前には必ず日付型を確認してください。
商品コードから一部を取り出す
実務データでは、商品コードや部署コードの一部に意味が埋め込まれていることがよくあります。たとえば「A-100-01」の先頭部分だけを分類コードとして取り出す例です。
let
Source = 商品テーブル,
AddedCategoryCode = Table.AddColumn(
Source,
"分類コード",
each Text.BeforeDelimiter([商品コード], "-"), // 最初のハイフンより前を取り出す
type text
)
in
AddedCategoryCodePower Queryこのような文字列処理は実務で頻出です。列追加と文字列関数の組み合わせは、Power Queryを使いこなすうえで非常に重要な引き出しになります。
重要なので深掘りしたい注意点
nullと空文字は別物です
初心者が特に混乱しやすいのが、null と空文字の違いです。Power Queryではこの2つは別物です。
nullは「値が存在しない」状態です""は「長さ0の文字列」です
見た目ではどちらも空欄のように見えることがありますが、処理結果は変わります。特に文字列結合や条件分岐では影響が大きいです。実務データには空欄や欠損が必ず混ざる前提で考え、null対策をした列追加を書くことが大切です。
複雑なロジックは1列で無理に完結させない
初心者ほど、ひとつの追加列の式にすべてを書きたくなりがちです。しかし実務では、処理を分けて書いたほうが安全で分かりやすいです。
たとえば、最終的に「顧客ランク」を作りたい場合でも、いきなり長大な条件式を書くより、次のように段階を分けるほうが保守しやすいです。
- まず購入金額から高額フラグを作る
- 次に購入回数から継続フラグを作る
- 最後にその2つを組み合わせて顧客ランクを作る
このように中間列を活用すると、途中結果を確認しやすく、バグの原因も見つけやすくなります。最終的に不要な補助列は最後に削除すれば問題ありません。
列名は意味が分かるものにする
列名を「結果」「判定」「列1」のように曖昧にすると、あとで必ず困ります。列名を見ただけで内容が分かるようにすることが重要です。
- 金額
- 売上年月
- 在庫確認フラグ
- 顧客ランク
- 商品分類コード
列名の付け方は地味ですが、実務では非常に大きな差になります。自分だけでなく、あとで見る人にも分かる名前にすることを意識してください。
入力データを無条件に信用しない
情報セキュリティとデータ品質の観点から見ても、入力値を無条件に信用しない姿勢は非常に重要です。現場データには、予想外の文字、型崩れ、空白、不正な日付、異常値が混ざることがあります。
たとえば次のような問題は珍しくありません。
- 数値列に「N/A」や「不明」が混ざっている
- 日付列に文字列形式のデータが紛れている
- コード列に前後の空白が入っている
- 必須項目が空欄になっている
このような前提に立つと、列追加は単なる便利機能ではなく、データの不整合を見つけたり、業務ルールを明文化したりする重要な工程だと分かります。実務では「想定通りのデータしか来ない」と考えないことが大切です。
初心者向けにおすすめの書き方
まずは短く作り、次に安全性を上げる
学習初期は、いきなり完璧なコードを目指さなくても大丈夫です。まずは短い式で動かし、そのあとで型変換、null対策、列名整理を加えていくと理解しやすいです。
たとえば次のような順番で成長させるとよいです。
- 最初は単純な掛け算だけ書く
- 次に型変換を入れる
- 次にnull対策を入れる
- 最後に列名やステップ名を整理する
この積み上げ方なら、どこで理解が止まったかも自分で把握しやすくなります。
GUI操作とコードをセットで学ぶ
Power QueryはGUIでも操作できるため、初心者でも入りやすいです。ただし、実務で応用力を付けるには、生成されたMコードを少しずつ読む習慣が大切です。
おすすめの学び方は次の流れです。
- 画面操作でカスタム列を追加する
- 生成されたMコードを見る
- 列名や式の意味を読み解く
- 少しだけ手で書き換えて試す
この繰り返しで、画面操作しかできない状態から、自分で意図的に設計できる状態へ進みやすくなります。
すぐ使える実務テンプレート集
テンプレート1:数値計算列を追加する
let
Source = 元テーブル,
ChangedType = Table.TransformColumnTypes(
Source,
{
{"数値列1", type number}, // 1つ目の数値列を数値型に変換する
{"数値列2", type number} // 2つ目の数値列を数値型に変換する
}
),
AddedCalculatedColumn = Table.AddColumn(
ChangedType,
"計算結果",
each [数値列1] * [数値列2], // 必要に応じて加算・減算・除算に変更できる
type number
)
in
AddedCalculatedColumnPower Queryテンプレート2:条件判定列を追加する
let
Source = 元テーブル,
AddedFlagColumn = Table.AddColumn(
Source,
"判定結果",
each if [判定対象列] >= 100 then "OK" else "NG", // 閾値で判定する
type text
)
in
AddedFlagColumnPower Queryテンプレート3:文字列結合列を追加する
let
Source = 元テーブル,
AddedTextColumn = Table.AddColumn(
Source,
"連結列",
each
(if [文字列列1] = null then "" else [文字列列1]) &
"_" &
(if [文字列列2] = null then "" else [文字列列2]), // null対策をしながら文字列を結合する
type text
)
in
AddedTextColumnPower Queryテンプレート4:日付加工列を追加する
let
Source = 元テーブル,
ChangedType = Table.TransformColumnTypes(
Source,
{{"日付列", type date}} // 日付列を日付型に変換する
),
AddedYearMonthColumn = Table.AddColumn(
ChangedType,
"年月",
each Date.ToText([日付列], "yyyy-MM"), // 年月形式の文字列を作る
type text
)
in
AddedYearMonthColumnPower Queryテンプレート5:複数条件で区分列を追加する
let
Source = 元テーブル,
AddedCategoryColumn = Table.AddColumn(
Source,
"区分",
each
if [点数] >= 80 then "優"
else if [点数] >= 60 then "良"
else "要改善", // 上から順に条件を評価する
type text
)
in
AddedCategoryColumnPower Queryまとめ
Power Queryで列を追加する技術は、見た目以上に実務価値の高いスキルです。単純な計算列を増やすだけでなく、判定ロジックの見える化、日付や文字列の整形、データ品質チェックなどにも広く活用できます。
初心者のうちは、まず Table.AddColumn の基本形に慣れ、「各行に対してルールを適用する」という考え方を身につけることが大切です。そのうえで、型変換、null対策、意味のある列名、段階的な分割といった実務の視点を加えると、ぐっと壊れにくいクエリになります。
- まず材料になる列を決める
- 1行分のルールを日本語で説明する
- 短い式で試す
- 型とnull対策を加える
- 読みやすい列名とステップ名に整える
この流れを意識するだけで、Power Queryの列追加は単なる操作から、実務で通用する設計へと変わっていきます。繰り返しになりますが、列追加は「新しい値を作る」だけではなく、「業務ルールを安全に再現する」ための重要な技術です。まずは金額計算や判定列の追加から始めて、少しずつ自分の業務データに置き換えて練習していくと、着実に力が身についていきます。

