「型を指定する」とは何か
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 または textnullable 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 QueryM言語では、type text や type 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言語の型として丁寧に表現していっていただきたいです。

