与 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]
。 将此新列命名为 最终速率。
如果找不到错误,此公式将尝试评估 标准速率 列并输出其值。 如果在 “标准速率 ”列中找到错误,则输出是在语句之后 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
处理错误,以及正确的值或错误记录。
可以使用记录值展开此新建的列,并通过选择列标题旁边的图标来查看要展开的可用字段。
此操作公开三个新的字段:
- All Errors.HasError——用于显示标准速率列中的值是否有错误。
-
所有 Errors.Value — 如果 “标准费率 ”列中的值没有错误,则此列显示 “标准费率 ”列中的值。 对于出现错误的值,此字段不可用,在展开作期间,此列具有
null
值。 -
所有 Errors.Error — 如果 标准速率 列中的值出现错误,则此列会显示 标准速率 列值的错误记录。 对于没有错误的值,此字段不可用,在展开操作期间,此列包含
null
值。
若要进一步调查,可以扩展 所有 Errors.Error 列以获取错误记录的三个组件。
- 错误原因
- 错误消息
- 错误详细信息
执行展开操作后,All Errors.Error.Message字段将显示特定的错误消息,告知您每个单元格的 Excel 错误。 错误消息派生自错误记录的 “错误消息 ”字段。
现在,每个错误消息都在新列中,您可以创建一个名称为最终速率的新条件列,并包含以下子句:
- 如果 “所有 Errors.Error.Message ”列中的值相等
null
,则输出是 “标准速率 ”列中的值。 - 否则,如果 “所有 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