実務で使えるPower Query小技・テクニック | 型を指定する

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

「型を指定する」とは何か

Power Query(M言語)で「型を指定する」とは、その値や列が「何として扱われるべきか」を明示的に決めることです。 たとえば、同じ「123」という見た目でも、

  • 数値として計算したいのか
  • 文字列としてコード扱いしたいのか
  • 日付として扱いたいのか によって、意味も処理もまったく変わります。

型をきちんと指定しておくことは、

  • 計算ミスや変換エラーを防ぐ
  • セキュリティ・品質を高める
  • クエリの意図を他の人にも伝えやすくする ための、非常に重要な基本テクニックです。

M言語でよく使う基本的な型

代表的なスカラー型

M言語でよく登場する基本的な型は次の通りです。

  • type text:文字列(顧客名、コード、メモなど)
  • type number:数値(売上金額、数量、率など)
  • type logical:論理値(true / false)
  • type date:日付(2026-09-16 など)
  • type time:時刻(10:30:00 など)
  • type datetime:日付+時刻
  • type any:どんな型でも許容(ただし乱用は危険)

これらに加えて、

  • nullable 型(null を許容する型)
  • 複合型(list, record, table など) もありますが、まずは「text / number / logical / date / datetime」を押さえると実務で困りにくくなります。

ステップバイステップで「型を指定する」を理解する

ステップ1:値に型を付ける

M言語では、値に対して直接型を指定することができます。

let
    TextValue = "123" as text,
    NumberValue = 123 as number,
    FlagValue = true as logical
in
    [TextValue = TextValue, NumberValue = NumberValue, FlagValue = FlagValue]
Power Query

ここでのポイントは、

  • "123" as text:文字列として扱う
  • 123 as number:数値として扱う
  • true as logical:論理値として扱う

というように、「as 型名」で型を明示できることです。

これにより、後続の処理で「この値は何として扱われるべきか」がはっきりします。

ステップ2:テーブルの列に型を指定する

実務では、テーブルの列に対して型を指定する場面が圧倒的に多いです。 代表的な関数が Table.TransformColumnTypes です。

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

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

ここでは、

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

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

「列の意味に合わせて型を決める」ことが、実務の品質を支える重要なステップです。

ステップ3:関数の引数・戻り値に型を指定する

関数を作るときにも、引数や戻り値に型を付けることができます。

let
    CalcTaxIncluded =
        (price as number, taxRate as number) as number =>
            price * (1 + taxRate)
in
    CalcTaxIncluded
Power Query

ここでのポイントは、

  • price as number:数値として受け取る
  • taxRate as number:数値として受け取る
  • as number:戻り値も数値

というように、関数のインターフェースとして型を明示していることです。

これにより、

  • 間違った型の値が渡されたときに早期にエラーになる
  • 関数の意図が読みやすくなる
  • セキュリティ・品質の観点からも安全になる

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

nullable 型と null の扱い

nullable 型とは何か

M言語では、null を許容する型を nullable 型 と呼びます。 たとえば、

  • nullable text:null または text
  • nullable number:null または number

というように、「null を含む可能性がある」ことを型として表現できます。

例:null を許容する引数と戻り値

let
    CleanCustomerCode =
        (code as nullable text) as nullable text =>
            if code = null then
                null
            else
                Text.Upper(Text.Trim(code))
in
    CleanCustomerCode
Power Query

ここでは、

  • 引数 code:null もテキストも受け取る
  • 戻り値:null またはテキスト

という設計になっています。

「null が入りうるかどうか」を型で表現しておくことは、エラー防止と意図の共有にとても役立ちます。

テーブル列の nullable 型

Table.TransformColumnTypes でも、nullable 型を意識することが重要です。

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

    TypedTable =
        Table.TransformColumnTypes(
            SalesTable,
            {
                {"顧客コード", type text},              // null を許容(デフォルトで nullable)
                {"金額", type number},                  // null を許容
                {"売上日", type date}                   // null を許容
            }
        )
in
    TypedTable
Power Query

M言語では、type texttype number は基本的に「null を許容する型」として扱われます。 ただし、「この列に null が入ってもよいのか?」という設計上の問いは常に意識しておくべきポイントです。

型を指定するときの重要な注意点

1. 「見た目」ではなく「意味」で型を決める

同じ「123」でも、

  • 顧客コードなら text
  • 売上金額なら number
  • 日付コードなら text(日付型に変換する前の状態)

というように、「何に使うか」「業務的な意味は何か」で型を決める必要があります。

悪い例:

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

良い例:

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

顧客コードは「計算するもの」ではなく「識別するもの」なので、 text 型にしておく方が安全で、意図にも合っています。

2. 型変換時のエラーを意識する

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

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

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

このとき、

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

となります。

そのため、

  • 事前にクレンジングしておく
  • エラー行を別テーブルに分離する
  • 変換後にエラーをチェックする

などの工夫が必要です。

「型を指定する=変換エラーの可能性を受け入れる」ということでもあるため、エラー処理をセットで考えることが重要です。

3. セキュリティ・品質の観点からの型指定

型は、セキュリティや品質にも直結します。

  • 金額を text のまま扱うと、計算漏れや比較ミスが起きやすい
  • 権限フラグを text で扱うと、"true" / "false" / "yes" / "1" などが混在して危険
  • 日付を text のまま扱うと、範囲判定やソートが不正確になる

例:権限フラグを logical 型にする

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

    TypedUserTable =
        Table.TransformColumnTypes(
            UserTable,
            {
                {"IsActive", type logical},
                {"IsAdmin", type logical}
            }
        )
in
    TypedUserTable
Power Query

このように、

  • true / false だけを許容する
  • 「文字列の揺れ」を排除する

ことで、セキュリティ判定ロジックの安全性が大きく向上します。

実務で使える「型指定」テンプレート

テンプレ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
    CalcFinalAmount =
        (price as number, taxRate as number, discountRate as number) as number =>
            let
                discount = price * discountRate,
                taxed = (price - discount) * (1 + taxRate)
            in
                taxed
in
    CalcFinalAmount
Power Query

テンプレ3:論理値列の型指定(セキュリティ・品質向上)

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

    TypedUserTable =
        Table.TransformColumnTypes(
            UserTable,
            {
                {"IsActive", type logical},
                {"IsAdmin", type logical}
            }
        )
in
    TypedUserTable
Power Query

まとめ:「型を指定する」は“データの意味をコードに刻む”こと

M言語で「型を指定する」というのは、 「この値・この列・この引数は、何として扱われるべきか」という“意味”をコードとして明示することです。

これによって、

  • 計算や比較の挙動が安定する
  • エラーや誤判定を防ぎ、品質が向上する
  • セキュリティに関わるフラグやロールを安全に扱える
  • クエリの意図が他の人にも伝わりやすくなる

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

型指定は、Power Query を「ただ動くコード」から「設計されたコード」に変えていくための土台ですので、 ぜひ「見た目ではなく意味で型を決める」「nullable と null を意識する」「セキュリティ・品質に直結する列ほど型を厳密にする」という感覚を持って、 実務のデータとロジックを M言語の型として丁寧に表現していっていただきたいです。

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