「型変換を行う」とは何か
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.Type や Table.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.RemoveRowsWithErrorsやTable.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ここでは、
- まず
Text.Trimで前後の空白を削除し、空文字は null にする - そのうえで
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言語の型変換で丁寧に整えていっていただきたいです。
