類似於 Excel 和 DAX 語言具有的 IFERROR 函式,Power Query 有自己的語法來測試和攔截錯誤。
如在 Power Query 中處理錯誤一文中所述,錯誤可能會出現在步驟或儲存格層級。 本文著重於如何根據您自己的特定邏輯來攔截和管理錯誤。
備註
為了示範此概念,本文會使用 Excel 活頁簿作為其數據源。 此處所展示的概念適用於Power Query 中的所有值,而不只是來自Excel活頁簿的概念。
此示範的範例數據源是具有下表的 Excel 活頁簿。
Excel 活頁簿中的這個資料表有 Excel 錯誤,例如標準速率數據行中的 #NULL!、#REF!和 #DIV/0! 。 當您將此數據表匯入 Power Query 編輯器時,下圖顯示其外觀。
請注意 Excel 活頁簿中的錯誤如何在每個儲存格中以 [Error] 值顯示。
在本文中,您將瞭解如何將錯誤取代為另一個值。 此外,您也會瞭解如何攔截錯誤,並將其用於您自己的特定邏輯。
尋找錯誤時提供替代值
在此情況下,目標是在範例數據源中建立新的 最終速率 數據行,以使用 標準速率 數據行的值。 如果有任何錯誤,則會使用對應 [特殊速率 ] 資料行中的值。
若要建立新的自定義數據行,請移至 [ 新增數據行 ] 功能表,然後選取 [ 自定義數據行]。 在 [ 自訂資料列 ] 視窗中,輸入公式 try [Standard Rate] otherwise [Special Rate]。 將此新數據行命名 為 Final Rate。
此公式會嘗試評估 標準速率 數據行,並在找不到錯誤時輸出其值。 如果在 [標準速率 ] 資料行中找到錯誤,則輸出是在 語句之後 otherwise 定義的值,在此案例中為 [特殊速率 ] 數據行。
將正確的數據類型新增至數據表中的所有數據行之後,下圖顯示最終數據表的外觀。
備註
作為替代方法,您也可以輸入公式 try [Standard Rate] catch ()=> [Special Rate],這相當於上一個公式,但使用 catch 關鍵詞及不需參數的函式。
關鍵詞 catch 於 2022 年 5 月引進 Power Query。
提供您自己的條件式錯誤邏輯
使用與上一節相同的範例數據源,新的目標是建立 最終速率的新數據行。 如果 標準速率 中的值存在,則會使用該值。 否則會使用 特殊速率 欄中的值,但有任何 #REF! 錯誤的數據行除外。
備註
排除 #REF! 錯誤的唯一目的是為了示範目的。 透過本文所展示的概念,您可以從錯誤記錄鎖定您選擇的任何字段。
當您選取錯誤值旁的任何空格時,您會在畫面底部取得詳細資料窗格。 詳細資料窗格同時包含錯誤原因和DataFormat.Error錯誤訊息: Invalid cell value '#REF!'
您一次只能選取一個數據格,因此您一次只能檢查一個錯誤值的錯誤元件。 此時您會建立新的自定義數據行,並使用 try 表示式。
搭配自訂邏輯使用try
若要建立新的自定義數據行,請移至 [ 新增數據行 ] 功能表,然後選取 [ 自定義數據行]。 在 [ 自訂資料列 ] 視窗中,輸入公式 try [Standard Rate]。 將此新數據行命名 為 [所有錯誤]。
表達式 try 會將值和錯誤轉換成記錄值,指出表達式是否 try 處理錯誤,以及適當的值或錯誤記錄。
您可以使用記錄值展開這個新建立的數據行,並選取數據行標頭旁的圖示,查看要展開的可用字段。
此作業會公開三個新的欄位:
- 所有 Errors.HasError — 顯示 標準速率 欄位的值是否有錯誤。
-
所有 Errors.Value—如果 標準速率 欄的值沒有錯誤,則此欄會顯示來自 標準速率 欄的值。 對於發生錯誤的值,此字段無法使用,而且展開作業期間,此數據行具有
null值。 -
所有 Errors.Error—如果 標準速率 欄中的值發生錯誤,則此欄會顯示來自 標準速率 欄的值的錯誤記錄。 對於沒有錯誤的值,此欄位不可用,而且展開作業期間,此數據行具有
null值。
若要進一步調查,您可以展開 所有 Errors.Error 欄,以取得錯誤記錄的三個元件:
- 錯誤原因
- 錯誤訊息
- 錯誤詳情
執行展開作業之後,所有 Errors.Error.Message 欄位會顯示特定的錯誤訊息,精確地告訴您每個儲存格發生的 Excel 錯誤。 錯誤訊息衍生自錯誤記錄的 [ 錯誤訊息 ] 欄位。
現在,有了新數據行中的每個錯誤訊息,您就可以建立名稱為 Final Rate 和下列子句的新條件數據行:
- 如果 [所有 Errors.Error.Message ] 數據行中的值等於
null,則輸出會是 [標準速率 ] 資料行的值。 - 否則,如果 All Errors.Error.Message 資料行中的值不等於
Invalid cell value '#REF!'.,則輸出會是 特殊速率 資料行的值。 - 否則為 null。
在只保留 [帳戶]、[ 標準費率]、[ 特殊費率] 和 [ 最終費率 ] 數據行,併為每個數據行新增正確的數據類型之後,下圖會示範最終數據表的外觀。
使用 try 和 catch 搭配自定義邏輯
或者,您也可以使用 try 和 catch 關鍵詞建立新的自定義數據行。
try [Standard Rate] catch (r)=> if r[Message] <> "Invalid cell value '#REF!'." then [Special Rate] else null
自定義資料欄對話框的螢幕截圖,其中展示了使用 try 和 catch 語法結構的新公式。