Excel と DAX 言語に IFERROR 関数があるのと同様に、Power Query には、エラーをテストしてキャッチするための独自の構文があります。
Power Query でのエラーの処理に関する記事で説明したように、エラーはステップ レベルまたはセル レベルで表示される可能性があります。 この記事では、独自のロジックに基づいてエラーをキャッチして管理する方法について説明します。
注
この概念を示すために、この記事では Excel ブックをデータ ソースとして使用します。 ここで紹介する概念は、Excel ブックからの値だけでなく、Power Query のすべての値にも適用されます。
このデモのサンプル データ ソースは、次の表を含む Excel ブックです。
Excel ブックのこのテーブルには、[標準単価] 列に #NULL!、#REF!、#DIV/0! などの Excel エラーがあります。 このテーブルを Power Query エディターにインポートすると、次の図にその外観が示されます。
Excel ブックのエラーが、各セルの [Error] 値と共にどのように表示されるかに注目してください。
この記事では、エラーを別の値に置き換える方法について説明します。 さらに、エラーをキャッチし、独自のロジックに使用する方法についても説明します。
エラーを見つけるときに代替値を指定する
この場合、目標は、Standard Rate 列の値を使用する新しい最終レート列をサンプル データ ソースに作成することです。 エラーがある場合は、対応する [特別単価 ] 列の値が使用されます。
新しいカスタム列を作成するには、[列の 追加 ] メニューに移動し、[ カスタム列] を選択します。 [ カスタム列 ] ウィンドウで、数式 try [Standard Rate] otherwise [Special Rate]を入力します。 この新しい列に Final Rate という名前を付けます。
この数式は 、標準レート 列の評価を試み、エラーが見つからない場合にその値を出力します。
標準単価列にエラーが見つかった場合、出力は otherwise ステートメントの後に定義された値になります。この場合は、特殊レート列です。
テーブル内のすべての列に正しいデータ型を追加した後、次の図は最終的なテーブルの外観を示しています。
注
別の方法として、前の数式と同じ try [Standard Rate] catch ()=> [Special Rate]式を入力することもできますが、パラメーターを必要としない関数で catch キーワードを使用します。
catch キーワードは、2022 年 5 月に Power Query に導入されました。
独自の条件付きエラー ロジックを指定する
前のセクションと同じサンプル データ ソースを使用して、新しい目標は 、最終レートの新しい列を作成することです。
標準レートの値が存在する場合は、その値が使用されます。 それ以外の場合は、エラーが発生した行を除き、 Special Rate 列の値 #REF! 使用されます。
注
#REF!エラーを除外する唯一の目的は、デモンストレーションの目的です。 この記事で紹介する概念を使用すると、エラー レコードから任意のフィールドを対象にすることができます。
エラー値の横にある空白を選択すると、画面の下部に詳細ウィンドウが表示されます。 詳細ウィンドウには、エラーの理由、 DataFormat.Error、およびエラー メッセージの両方が含 Invalid cell value '#REF!'。
一度に選択できるセルは 1 つだけであるため、一度に 1 つのエラー値のエラー コンポーネントのみを効果的に調べることができます。 この時点で、新しいカスタム列を作成し、 try 式を使用します。
カスタム ロジックで try を使用する
新しいカスタム列を作成するには、[列の 追加 ] メニューに移動し、[ カスタム列] を選択します。 [ カスタム列 ] ウィンドウで、数式 try [Standard Rate]を入力します。 この新しい列 に [すべてのエラー] という名前を付けます。
try式は、値とエラーを、try式がエラーを処理したかどうか、および適切な値またはエラー レコードを示すレコード値に変換します。
新しく作成されたこの列をレコード値と共に展開し、列ヘッダーの横にあるアイコンを選択して、展開できるフィールドを確認できます。
この操作では、次の 3 つの新しいフィールドが公開されます。
- Errors.HasError—Standard Rate 列の値にエラーがあるかどうかを表示します。
-
すべての Errors.Value — 標準単価 列の値にエラーがない場合、この列には 標準単価 列の値が表示されます。 エラーのある値の場合、このフィールドは使用できません。展開操作中、この列には
null値があります。 -
すべての Errors.Error — Standard Rate 列の値にエラーが発生した場合、この列には標準 単価 列の値のエラー レコードが表示されます。 エラーのない値の場合、このフィールドは使用できません。展開操作中、この列には
null値があります。
さらに調査するために、[ All Errors.Error ] 列を展開して、エラー レコードの 3 つのコンポーネントを取得できます。
- エラーの理由
- エラーメッセージ
- エラーの詳細
展開操作を実行すると、 すべての Errors.Error.Message フィールドに、各セルに含まれる Excel エラーを正確に示す特定のエラー メッセージが表示されます。 エラー メッセージは、エラー レコードの [エラー メッセージ ] フィールドから派生します。
新しい列に各エラー メッセージが表示されたので、 Final Rate という名前と次の句を含む新しい条件付き列を作成できます。
-
All Errors.Error.Message 列の値が
nullと等しい場合、出力は Standard Rate 列の値になります。 - それ以外の場合、[ All Errors.Error.Message ] 列の値が
Invalid cell value '#REF!'.等しくない場合、出力は [特別率 ] 列の値になります。 - それ以外の場合は null。
Account、Standard Rate、Special Rate、Final Rate の各列のみを保持し、各列に適切なデータ型を追加した後、次の図は最終的なテーブルの外観を示しています。
カスタム ロジックで try と catch を使用する
または、 try キーワードと catch キーワードを使用して新しいカスタム列を作成することもできます。
try [Standard Rate] catch (r)=> if r[Message] <> "Invalid cell value '#REF!'." then [Special Rate] else null