実務で使えるPower Query小技・テクニック | 型変換を行う

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

「型変換を行う」とは何か

Power Query(M言語)で「型変換を行う」とは、ある値や列を「別の型」として扱えるように変換することです。 たとえば、Excelから読み込んだときに「金額」が文字列(text)になっている場合、それを数値(number)に変換して初めて正しく計算できます。 逆に、日付を文字列に変換してフォーマットを整えたい、といった場面もあります。

型変換は、

  • 計算・集計・比較を正しく行うための前処理
  • セキュリティ・品質を守るためのチェックポイント として、実務の Power Query では必須のテクニックです。

型変換の基本:as と Table.TransformColumnTypes

値に対する型変換(as を使う)

単一の値に対して型変換を行う基本形は次の通りです。

let
    TextValue = "123",
    NumberValue = TextValue as number,
    DateValue = "2024-04-01" as date
in
    [NumberValue = NumberValue, DateValue = DateValue]
Power Query

ここでのポイントは、

  • "123" as number:文字列を数値に変換
  • "2024-04-01" as date:文字列を日付に変換

というように、値 as 型 で型変換を行うことです。

ただし、変換できない値(例:”ABC” を number に変換)はエラーになるため、 「変換前にクレンジングする」「エラー行を分離する」といった工夫が必要になります。

テーブル列に対する型変換(Table.TransformColumnTypes)

実務では、テーブルの列に対して型変換を行うことが圧倒的に多いです。 代表的な関数が Table.TransformColumnTypes です。

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

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

ここでは、

  • 顧客コード・顧客名:文字列(text)
  • 金額:数値(number)
  • 売上日:日付(date)

という型に変換しています。

「列の意味に合わせて型を変換する」ことが、後続の計算・集計・フィルタを正しく動かすための土台になります。

ステップバイステップで「型変換」を設計する

ステップ1:現状の型を確認する

まず、「今その列が何型になっているか」を確認することが重要です。 Power Query エディタでは、列ヘッダーのアイコンで型が分かります(123=number、ABC=text、カレンダー=date など)。

Mコード上では、Value.TypeTable.Schema を使って確認することもできます。

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],
    Schema = Table.Schema(SalesTable)
in
    Schema
Power Query

これにより、

  • 各列の現在の型
  • どの列が text のままになっているか
  • 数値や日付として扱いたい列がどれか

を把握したうえで、型変換の方針を立てられます。

ステップ2:列の「意味」に基づいて目標の型を決める

型変換は、「見た目」ではなく「意味」で決めることが重要です。

  • 顧客コード:計算しない識別子 → text
  • 売上金額:計算・集計する → number
  • 売上日:日付として範囲判定やソートをする → date
  • フラグ(有効/無効):true / false だけにしたい → logical

悪い例(意味に合わない型変換):

{"顧客コード", type number}   // コードを数値にしてしまう
Power Query

良い例:

{"顧客コード", type text}
Power Query

「この列は何に使うのか?」を考えてから型変換を行うことが、品質とセキュリティの両面で非常に重要です。

ステップ3:型変換時のエラーを想定する

型変換では、変換できない値があるとエラーになります。

例:文字列列を number に変換する場合

let
    TypedTable =
        Table.TransformColumnTypes(
            Source,
            {{"金額", type number}}
        )
in
    TypedTable
Power Query

このとき、

  • "1000" → 1000 に変換可能
  • "ABC" → number に変換できずエラー

となります。

そのため、次のような対策が必要です。

  • 事前クレンジング:不要な文字を削除する、空白をトリムする
  • エラー行の分離Table.RemoveRowsWithErrorsTable.SelectRows でエラー行を別テーブルにする
  • 変換後のチェック:エラー件数を確認し、想定外の値がないか確認する

例:エラー行を分離するテンプレート

let
    TypedTable =
        Table.TransformColumnTypes(
            Source,
            {{"金額", type number}}
        ),

    ErrorRows =
        Table.SelectRows(
            TypedTable,
            each try [金額] otherwise null = null
        )
in
    [Typed = TypedTable, Errors = ErrorRows]
Power Query

「型変換=エラーの可能性がある処理」として、必ずエラー対策をセットで考えることが実務では重要です。

よく使う型変換の具体例

文字列 → 数値

ExcelやCSVから読み込んだときに、金額や数量が text になっていることはよくあります。

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    CleanedTable =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "金額",
                    each if _ = null or _ = "" then null else Text.Trim(_),
                    type text
                }
            }
        ),

    TypedTable =
        Table.TransformColumnTypes(
            CleanedTable,
            {{"金額", type number}}
        )
in
    TypedTable
Power Query

ここでは、

  1. まず Text.Trim で前後の空白を削除し、空文字は null にする
  2. そのうえで type number に変換

という二段構えにしています。

「クレンジング → 型変換」という順番を守ることで、エラーを減らしつつ安全に数値化できます。

文字列 → 日付

日付も、最初は text として入っていることが多いです。

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    TypedTable =
        Table.TransformColumnTypes(
            SalesTable,
            {{"売上日", type date}}
        )
in
    TypedTable
Power Query

ただし、日付フォーマットがバラバラな場合(例:”2024/4/1″ と “2024-04-01” が混在)には、 事前にフォーマットを揃える必要があります。

例:Date.From を使った変換

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    ConvertedDate =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "売上日",
                    each try Date.From(_) otherwise null,
                    type date
                }
            }
        )
in
    ConvertedDate
Power Query

ここでは、

  • Date.From で日付に変換を試みる
  • 変換できない場合は null にする

という形で、エラーを避けつつ日付型に変換しています。

文字列 → 論理値(true / false)

セキュリティや品質に関わるフラグ列は、論理値(logical)に変換しておくと安全です。

let
    UserTable = Excel.CurrentWorkbook(){[Name="ユーザー"]}[Content],

    CleanedUserTable =
        Table.TransformColumns(
            UserTable,
            {
                {
                    "IsActive",
                    each if _ = "Y" then true else false,
                    type logical
                },
                {
                    "IsAdmin",
                    each if _ = "1" then true else false,
                    type logical
                }
            }
        )
in
    CleanedUserTable
Power Query

ここでは、

  • "Y" / "1" などの文字列を true / false に変換
  • そのうえで logical 型として扱う

ことで、「文字列の揺れ」を排除し、判定ロジックを安全に保っています。

セキュリティ・品質の観点からの型変換

1. フラグやロールを文字列のままにしない

権限や有効/無効フラグを text のまま扱うと、

  • "true" / "True" / "1" / "Y" などが混在
  • 比較条件が複雑になり、バグや抜け漏れが発生しやすい

というリスクがあります。

論理値に変換しておくことで、

  • true / false だけを扱うシンプルなロジックにできる
  • セキュリティ判定の抜け漏れを防ぎやすくなる

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

2. 金額や数量を text のままにしない

金額や数量が text のままだと、

  • ソートが「文字列順」になり、100 より 20 が後ろになるなどの不自然な結果
  • 集計や平均が正しく計算されない
  • 比較条件(>、<)が意図通りに動かない

といった問題が起きます。

必ず number に型変換しておくことで、

  • 計算・集計・比較が正しく動く
  • 品質チェックや閾値判定が安全に行える

ようになります。

3. 型変換は「仕様の一部」として扱う

型変換は、単なるテクニックではなく 「仕様の一部」です。

  • この列は数値として扱うべきか
  • この列は日付として扱うべきか
  • このフラグは論理値として扱うべきか

といった判断は、現場の業務仕様と密接に結びついています。

コードを書く側が勝手に型変換を決めるのではなく、 「この列は何に使うのか」を関係者と共有したうえで型変換を設計することが、セキュリティと品質の両面で重要です。

実務で使える「型変換」テンプレート

テンプレ1:売上テーブルの一括型変換

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

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

テンプレ2:文字列金額のクレンジング+型変換

let
    SalesTable = Excel.CurrentWorkbook(){[Name="売上"]}[Content],

    CleanedTable =
        Table.TransformColumns(
            SalesTable,
            {
                {
                    "金額",
                    each if _ = null or _ = "" then null else Text.Trim(_),
                    type text
                }
            }
        ),

    TypedTable =
        Table.TransformColumnTypes(
            CleanedTable,
            {{"金額", type number}}
        )
in
    TypedTable
Power Query

テンプレ3:フラグ列の論理値化(セキュリティ向上)

let
    UserTable = Excel.CurrentWorkbook(){[Name="ユーザー"]}[Content],

    CleanedUserTable =
        Table.TransformColumns(
            UserTable,
            {
                {
                    "IsActive",
                    each if _ = "Y" then true else false,
                    type logical
                },
                {
                    "IsAdmin",
                    each if _ = "1" then true else false,
                    type logical
                }
            }
        )
in
    CleanedUserTable
Power Query

まとめ:「型変換を行う」は“データを正しい姿に整える”こと

M言語で「型変換を行う」というのは、 「データを、その意味に合った型へと変換し、計算・比較・判定・セキュリティチェックを正しく行える状態に整えること」です。

これによって、

  • 数値・日付・論理値としての処理が安定する
  • エラーや誤判定を防ぎ、品質が向上する
  • 権限やフラグを安全に扱えるようになる
  • クエリ全体の意図が明確になり、保守性が高まる

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

型指定と型変換はセットで考えるべきテーマですので、 ぜひ「現状の型を確認する → 意味に基づいて目標の型を決める → クレンジング+型変換+エラー対策」という流れを意識しながら、 実務のデータを M言語の型変換で丁寧に整えていっていただきたいです。

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