Power Query 実務テンプレ | クレンジング(前処理)系:カンマ付き数値を数値化

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

ゴールのイメージをそろえる

今回のテーマは「1,23412,345,678 のような カンマ付き数値を、Power Query で“ちゃんと数値型”に変換する実務テンプレ」です。

見た目は数字なのに、実は「文字列」として扱われていて、
合計できない・並べ替えが文字順になる・JOIN で型が合わない——こういう地味にイラつく問題を一掃するのが目的です。

キーワードは「カンマを消す」「型を number にする」「エラーを出さないようにする」の3つです。


まず「なぜ数値になってくれないのか」を理解する

カンマが入っていると Power Query は「文字列」とみなす

Power Query は、1234 は数値として認識できますが、1,234 はそのままだと「数値」としては読めません。
カンマが入っている時点で、「これは文字列(text)だな」と判断されます。

その結果、次のようなことが起きます。

合計しようとしても、集計のメニューに出てこない(text だから)。
昇順ソートすると、1,000 より 900 が後ろに来る(文字列として比較される)。
別のテーブルの「数値型の列」と JOIN しようとしても、型が違って結合できない。

なので、やるべきことはシンプルで、

  1. カンマを取り除いて
  2. それを数値型(type number)に変換する

この2ステップをテンプレ化しておけばOKです。


例題の前提データをイメージする

次のようなテーブルを想像してください。

商品コード売上金額原価金額
A001“1,200”“800”
A002“12,345”“7,890”
A003“”“1,000”
A004null“2,500”

ポイントはここです。

売上金額・原価金額が、どちらも「文字列(text)」として入っている。
カンマ付きのものもあれば、空文字(””)や NULL も混ざっている。

このままでは「合計」「平均」「数値フィルタ」がまともに動きません。
ここに「カンマ付き数値を数値化」テンプレをかけて、きれいな number 型にしていきます。


一番シンプルな型:1列だけカンマを消して数値化する

売上金額列だけを数値化する基本パターン

まずは「売上金額」列だけを対象にした、最もシンプルなテンプレです。

let
    Source = ・・・前のステップ・・・,

    // 1) カンマを削除して文字列として整える
    RemovedComma =
        Table.TransformColumns(
            Source,
            {
                {
                    "売上金額",
                    each Text.Replace(Text.From(_), ",", ""),
                    type text
                }
            }
        ),

    // 2) 文字列を数値型に変換
    ChangedType =
        Table.TransformColumnTypes(
            RemovedComma,
            {{"売上金額", type number}}
        )
in
    ChangedType
Power Query

流れを言葉で追うとこうなります。

Text.From(_) で、値をいったん文字列として扱う(NULL が来てもエラーにならないようにするための保険)。
Text.Replace(..., ",", "") で、文字列中のカンマを全部削除する。
その結果 "1,200""1200""12,345""12345" になる。
最後に Table.TransformColumnTypes で、「売上金額」列を type number に変換する。

これで、「売上金額」はちゃんと数値として扱えるようになります。


重要ポイント1:NULL や空文字が混ざっているときの扱い

そのまま数値化するとエラーになるパターン

さっきの例には、""(空文字)や null が混ざっていました。
このまま type number に変換しようとすると、空文字は変換エラーになります。

実務的には、「空文字や NULL は 0 ではなく“欠損値(null)”として扱いたい」ことが多いので、
数値化の前に「空文字 → null」にそろえておくときれいです。

空文字を NULL にしてから数値化するテンプレ

let
    Source = ・・・前のステップ・・・,

    // 1) カンマを削除
    RemovedComma =
        Table.TransformColumns(
            Source,
            {
                {
                    "売上金額",
                    each Text.Replace(Text.From(_), ",", ""),
                    type text
                }
            }
        ),

    // 2) 空文字を null に統一
    BlankToNull =
        Table.TransformColumns(
            RemovedComma,
            {
                {
                    "売上金額",
                    each if _ = "" then null else _,
                    type nullable text
                }
            }
        ),

    // 3) 数値型に変換
    ChangedType =
        Table.TransformColumnTypes(
            BlankToNull,
            {{"売上金額", type number}}
        )
in
    ChangedType
Power Query

これで、"" は null になり、
null はそのまま null のまま、
数値に変換できるものだけが number になります。

「空欄は 0 ではなく“無いもの”として扱う」という、分析寄りのきれいな状態になります。


重要ポイント2:複数列をまとめてカンマ付き数値→数値化したい

売上金額と原価金額をまとめて処理する

実務では、「売上金額」「原価金額」「粗利金額」など、カンマ付き数値の列が複数あることが多いです。
その場合は、同じ処理を列ごとにコピペするより、「変換リスト」を使ってまとめて書いた方がきれいです。

let
    Source = ・・・前のステップ・・・,

    // 1) カンマ削除(複数列)
    RemovedComma =
        Table.TransformColumns(
            Source,
            {
                {
                    "売上金額",
                    each Text.Replace(Text.From(_), ",", ""),
                    type text
                },
                {
                    "原価金額",
                    each Text.Replace(Text.From(_), ",", ""),
                    type text
                }
            }
        ),

    // 2) 空文字 → null(複数列)
    BlankToNull =
        Table.TransformColumns(
            RemovedComma,
            {
                {
                    "売上金額",
                    each if _ = "" then null else _,
                    type nullable text
                },
                {
                    "原価金額",
                    each if _ = "" then null else _,
                    type nullable text
                }
            }
        ),

    // 3) 数値型に変換(複数列)
    ChangedType =
        Table.TransformColumnTypes(
            BlankToNull,
            {
                {"売上金額", type number},
                {"原価金額", type number}
            }
        )
in
    ChangedType
Power Query

この型を一度作っておけば、列名だけ差し替えて何度でも使えます。


もう一歩進んだ実務テンプレ:関数化して再利用する

「カンマ付き数値を数値化する関数」を1つ作っておく

毎回同じロジックを書くのが面倒なら、
「カンマ付き数値 → 数値」の変換を関数として切り出しておくと、どのクエリでも再利用できます。

// クエリ名:fn_CommaNumberToNumber
let
    CommaNumberToNumber = (value as nullable any) as nullable number =>
        let
            // null はそのまま
            v =
                if value = null then
                    null
                else
                    Text.From(value),

            // カンマ削除
            noComma =
                if v = null then
                    null
                else
                    Text.Replace(v, ",", ""),

            // 空文字は null に
            cleaned =
                if noComma = "" then
                    null
                else
                    noComma,

            // 数値に変換(変換できない場合はエラーになるので、必要なら try で包む)
            result =
                if cleaned = null then
                    null
                else
                    Number.From(cleaned)
        in
            result
in
    CommaNumberToNumber
Power Query

これを作っておけば、クエリ側はかなりスッキリ書けます。

let
    Source = ・・・前のステップ・・・,

    Converted =
        Table.TransformColumns(
            Source,
            {
                {"売上金額", fn_CommaNumberToNumber, type nullable number},
                {"原価金額", fn_CommaNumberToNumber, type nullable number}
            }
        )
in
    Converted
Power Query

「カンマ付き数値を数値化する」という意図が、コードから一目で分かるようになります。


実務での“ハマりポイント”と回避のコツ

ロケール(小数点とカンマの役割)が違うデータ

海外のデータだと、1.234,56 のように「カンマが小数点」「ピリオドが桁区切り」というパターンもあります。
この場合は、単純にカンマを消すと意味が変わってしまうので、
Value.ReplaceTypeNumber.FromText にロケールを指定する、という別のアプローチが必要になります。

日本語環境で、普通の「1,234,567」形式だけを扱う前提なら、
今回の「カンマ削除 → 数値化」で十分です。

文字列のまま放置すると何が起きるか

カンマ付き数値を text のまま放置すると、こんなことが起きます。

昇順ソートすると "9,000" より "10,000" が先に来る(文字列比較)。
合計しようとしても、そもそも集計メニューに「合計」が出てこない。
別テーブルの number 型列と JOIN しようとすると、型不一致で結合できない。

なので、「カンマ付き数値は必ずどこかのタイミングで数値化する」というのを、
クレンジングの“お約束”として持っておくといいです。


実務テンプレとしてのまとめ

「カンマ付き数値を数値化」の本質は、たった二つです。

カンマを文字列として削除してから、数値型に変換する。
NULL や空文字の扱い(null にするのか 0 にするのか)を、最初にルールとして決めておく。

この型さえ体に入れておけば、
売上金額・原価・数量・ポイント・残高など、「カンマ付きで出てくるあらゆる数値列」を、
迷わず“ちゃんと数値”として扱えるようになります。

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