【Excel】Power Queryで関数(M言語)を使う!Excelのif文・Text.Combineの基本記述

【Excel】Power Queryで関数(M言語)を使う!Excelのif文・Text.Combineの基本記述
🛡️ 超解決

ExcelのPower Queryで、M言語のif文やText.Combine関数を使いたい場面があります。これらの関数を使いこなせると、より高度なデータ加工が可能になります。この記事では、Power Queryにおけるif文とText.Combine関数の基本的な使い方を解説します。

Power Queryは、Excelに搭載されている強力なデータ整形ツールです。GUI操作だけでなく、M言語と呼ばれる関数型言語でより複雑な処理を記述できます。本記事を読むことで、これらの関数を使ったデータ加工の基本が理解できるようになります。

【要点】Power QueryでM言語のif文・Text.Combine関数を使う基本

  • M言語のif文: 条件分岐を行い、条件に応じて異なる値を返す際に使用します。
  • Text.Combine関数: 複数のテキストを結合して1つのテキストにする際に使用します。
  • カスタム列の追加: これらの関数を組み合わせて、新しい列を作成する手順を解説します。

ADVERTISEMENT

Power Queryにおけるif文の基本構造と用途

Power Queryで条件分岐を行うには、M言語のif文を使用します。ExcelのIF関数と似ていますが、記述方法や適用範囲が異なります。if文は、特定の条件が満たされた場合に一方の値や処理を実行し、満たされなかった場合に別の値や処理を実行させたい場合に役立ちます。例えば、ある列の値が特定の値以上であれば「合格」、そうでなければ「不合格」と表示するような場合に活用できます。

M言語のif文の基本的な構文は、「if 条件 then 真の場合の値 else 偽の場合の値」となります。この構造を理解することで、様々な条件に基づいたデータ加工が可能になります。ExcelのIF関数のようにネスト(入れ子)構造で複数の条件を設定することもできます。

if文の具体的な記述方法

M言語でのif文の記述は、Power Queryエディターの「カスタム列の追加」機能を使って行います。まず、加工したいテーブルを選択し、「列の追加」タブから「カスタム列」をクリックします。表示されるダイアログボックスの「新しい列名」に任意の列名を入力し、「カスタム数式」の欄にif文を記述します。

例えば、「売上」列が10000以上なら「高」、それ以外なら「低」と判定するカスタム列を追加する場合、数式は以下のようになります。

`if [売上] >= 10000 then “高” else “低”`

この例では、`[売上]`はテーブルの「売上」列を参照しています。数値比較の他に、テキスト比較や論理演算子(and, or, not)を使った複雑な条件も指定できます。

if文のネスト(入れ子)記述

複数の条件を順番に判定したい場合は、if文をネストさせます。これは、最初のif文の「偽の場合の値」の部分に、さらに別のif文を記述する方法です。例えば、成績判定で90点以上なら「秀」、80点以上なら「優」、60点以上なら「良」、それ以外なら「可」としたい場合などに使用します。

具体的な記述例は以下のようになります。

`if [点数] >= 90 then “秀” else if [点数] >= 80 then “優” else if [点数] >= 60 then “良” else “可”`

このように、条件が増えるごとにelse ifの部分を追加していきます。各条件は上から順に評価され、最初に真となった条件に対応する値が返されます。ネストが深くなりすぎると可読性が低下するため、注意が必要です。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

Text.Combine関数によるテキスト結合の基本

Text.Combine関数は、Power Queryで複数のテキスト値を1つに結合する際に使用します。ExcelのCONCATENATE関数やTEXTJOIN関数に似た機能ですが、Power Queryの文脈で使われます。複数の列に含まれるテキストデータを統合したり、特定の区切り文字で連結したりする場合に便利です。

この関数は、結合したいテキスト値のリスト(またはレコードのリスト)と、オプションで区切り文字を指定して使用します。基本的な構文は「Text.Combine(リスト, 区切り文字)」です。

Text.Combine関数の基本的な使い方

例えば、「姓」列と「名」列のテキストを、間にスペースを入れて結合し、「氏名」という新しい列を作成したい場合を考えます。これはカスタム列の追加機能で実現できます。

数式は以下のようになります。

`Text.Combine({[姓], [名]}, ” “)`

この例では、`{[姓], [名]}`で「姓」列と「名」列の値をリストとして指定しています。第2引数の`” “`は、各テキストの間に挿入する区切り文字(ここでは半角スペース)を指定しています。区切り文字を指定しない場合、テキストは区切りなしで結合されます。

複数の列をまとめて結合する

Text.Combine関数は、単一の列の複数の値だけでなく、テーブルの複数の列をまとめて結合する際にも活用できます。例えば、日付の「年」「月」「日」の各列を「YYYY/MM/DD」形式で結合したい場合などです。

この場合もカスタム列の追加機能を使用します。数式は以下のようになります。

`Text.Combine({Text.From([年]), Text.From([月]), Text.From([日])}, “/”)`

ここで重要なのは、数値型の列(年、月、日)を結合する前に、`Text.From()`関数を使ってテキスト型に変換することです。これにより、数値が文字列として扱われ、正しく結合できるようになります。区切り文字として`/`を指定しています。

if文とText.Combine関数を組み合わせた応用例

if文とText.Combine関数を組み合わせることで、より複雑で実用的なデータ加工が可能になります。例えば、特定の条件を満たす場合にのみ、複数のテキスト列を結合して表示する、といった処理が実現できます。

ここでは、ある商品が「在庫あり」の場合のみ、商品名と型番を結合して表示し、「在庫なし」の場合は「取り扱い終了」と表示する例を考えます。これは、カスタム列の追加機能でif文の中にText.Combine関数を組み込むことで実現します。

在庫状況に応じた商品名の表示

まず、テーブルに「商品名」列、「型番」列、「在庫状況」列があると仮定します。「在庫状況」列が「在庫あり」の場合に、「商品名」と「型番」を結合した文字列を表示し、それ以外の場合は「取り扱い終了」と表示するカスタム列を追加します。

数式は以下のようになります。

`if [在庫状況] = “在庫あり” then Text.Combine({[商品名], [型番]}, “-“) else “取り扱い終了”`

この数式では、`if [在庫状況] = “在庫あり”`で条件を判定しています。条件が真の場合(在庫あり)は、`Text.Combine({[商品名], [型番]}, “-“)`が実行され、商品名と型番がハイフンで結合されます。条件が偽の場合(在庫なしなど)は、`”取り扱い終了”`というテキストが表示されます。

特定条件でのみテキストを結合する

別の応用例として、ある値が一定以上の場合にのみ、複数のテキスト列を結合し、そうでない場合は結合せず、別のテキストを表示するケースも考えられます。例えば、注文金額が10000円以上の場合のみ、顧客名と注文IDを結合した文字列を生成し、それ以外の場合は「対象外」と表示する場合などです。

数式は以下のようになります。

`if [注文金額] >= 10000 then Text.Combine({[顧客名], [注文ID]}, “_ID_”) else “対象外”`

ここでは、`[注文金額]`列の値で条件分岐を行っています。10000円以上であれば、顧客名と注文IDが`_ID_`という区切り文字で結合されます。10000円未満の場合は「対象外」と表示されます。

ADVERTISEMENT

Power QueryでのM言語記述における注意点

Power QueryでM言語を記述する際には、いくつかの注意点があります。これらを理解しておくことで、予期せぬエラーを防ぎ、スムーズにデータ加工を進めることができます。

大文字・小文字の区別とスペルミス

M言語は、関数名、レコードフィールド名、テキスト値において大文字・小文字を区別します。例えば、`Text.Combine`と`text.combine`は異なるものとして扱われます。また、関数名やフィールド名のスペルミスはエラーの原因となります。入力候補が表示されるため、それを活用するとミスを減らせます。

特に、列名を指定する際には`[列名]`のように角括弧で囲む必要があります。この角括弧を忘れたり、列名がテーブルに存在しない場合はエラーとなります。数式バーに表示されるエラーメッセージをよく確認することが重要です。

テキスト値の引用符とデータ型の変換

テキスト値を扱う際には、必ずダブルクォーテーション(`”`)で囲む必要があります。例えば、`if [列A] = “完了”`のように記述します。シングルクォーテーション(`’`)は使用できません。また、数値や日付などのデータ型をテキストとして結合したい場合は、`Text.From()`関数などを使って明示的にテキスト型に変換する必要があります。前述の年・月・日を結合する例がこれに該当します。

逆に、テキスト型のデータを数値として扱いたい場合は、`Number.FromText()`関数などを使用します。データ型が一致しないと、比較や計算でエラーが発生することがあります。

エラー処理の基本

M言語のif文は、条件が満たされない場合に`else`句がないとエラーになります。必ず`then`と`else`の両方を記述してください。また、処理中にエラーが発生する可能性がある場合は、`try…otherwise`構文を使用してエラーを捕捉し、代替の値を返すように記述することも可能です。

例えば、数値変換が失敗する可能性がある場合に、エラー時は「無効」と表示する例は以下のようになります。

`try Text.From([数値列]) otherwise “無効”`

この構文は、`try`の後の処理が成功すればその結果を返し、失敗した場合は`otherwise`の後の値を返します。これにより、データの一貫性を保ちやすくなります。

機能 Excel関数 Power Query (M言語) 主な用途
条件分岐 IF関数 if文 特定の条件に基づき異なる値を返す
テキスト結合 CONCATENATE, TEXTJOIN関数 Text.Combine関数 複数のテキストを結合する
テキスト変換 TEXT関数など Text.From関数など 数値や日付をテキストに変換する

Power QueryでM言語のif文とText.Combine関数を使うことで、Excelだけでは難しかった複雑なデータ加工が効率的に行えるようになります。これらの関数を使いこなせば、データの整形、クリーニング、集計などの作業を自動化し、より高度な分析へと進むことができます。まずは簡単なカスタム列の追加から試してみましょう。

次に、これらの関数を組み合わせたより実践的なシナリオや、他のM言語関数との連携について学習を進めると、Power Queryの活用範囲がさらに広がります。例えば、List.TransformやTable.TransformColumnsといった関数と組み合わせることで、より大規模なデータセットに対する一括処理が可能になります。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】