我在 Excel for Microsoft 365 中使用 Power Query。
我要提出的问题与我最近提出的问题非常相似,并且给出了一个优雅的答案。这个问题在这里: Power Query:按存储为文本参数的名称引用列
在上面链接的问题中,我需要根据位置不变(始终是第一列)的列的空性来过滤行,但其名称很难使用,因为它存储在文本参数中。答案是降级标题(从而为它们提供可预测的名称),根据Column1的空性进行过滤,并提升标题(以恢复其原始名称)。保存列名称的文本参数最终没有发挥作用。
在当前问题中,我再次需要根据名称存储在文本参数中的列的空性来过滤行,但这一次,它并不总是第一列。它可以是第一、第二、第三或第四列。所以这一次,我确实必须使用指定列名的参数。
我将再次提出我原来的问题,并进行修改以反映这一新要求。
这是我的源数据表(其表名为Source):
第 1 列 | 第2栏 | 第3栏 | 第4栏 | 姓名 |
---|---|---|---|---|
11 | 21 | 31 | 41 | 狗 |
12 | 22 | 32 | 42 | 猫 |
23 | 33 | 43 | 鸵鸟 | |
14 | 24 | 44 | 长尾小鹦鹉 | |
15 | 25 | 35 | 45 | 鳟鱼 |
我定义了一个文本参数:
FilterColumn
指定将用于过滤空值的列的名称。它可以采用任何值Col1、Col2、Col3或Col4。
我的目标是开发一个 Power Query 来过滤掉由指定的列中存在空值的FilterColumn
行。
假设我设置FilterColumn
为Col3,所需的结果是:
第 1 列 | 第2栏 | 第3栏 | 第4栏 | 姓名 |
---|---|---|---|---|
11 | 21 | 31 | 41 | 狗 |
12 | 22 | 32 | 42 | 猫 |
23 | 33 | 43 | 鸵鸟 | |
15 | 25 | 35 | 45 | 鳟鱼 |
这是我的 Power Query 的 M 语言代码:
let
Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Col1", Int64.Type}, {"Col2", Int64.Type}, {"Col3", Int64.Type}, {"Col4", Int64.Type}, {"Name", Text.Type}}),
// #"Filtered Rows" = Table.SelectRows(#"Changed Type", each [FilterColumn] <> null and [FilterColumn] <> "")
// #"Filtered Rows" = Table.SelectRows(#"Changed Type", each FilterColumn <> null and FilterColumn <> "")
in
#"Filtered Rows"
这是#"Filtered Rows"应用步骤出了问题。在上面的代码中,我展示了我在实现此应用步骤时所做的两次(注释掉的)尝试。
在第一次尝试中,我只是直接引用列名称(带括号)。但是,FilterColumn
被视为感兴趣的列的名称,而不是作为文本参数保存列名称。由于没有名为FilterColumn的列,因此会引发错误:Expression.Error: The field 'FilterColumn' of the record wasn't found.
在第二次尝试中,我再次直接引用列名称,但这次没有括号。这不会引发错误,但不会过滤掉任何行。输出与输入相比没有变化。
如何根据参数命名的列中的空FilterColumn
值过滤掉行?
您需要将参数作为文本字符串传递,因此请尝试:
或者
这个也可以用,,,
注意
在这种方法中。
Table.SelectRows(...)
用于根据指定条件过滤行,&Table.SelectColumns(...)
用于从过滤后的行中选择所需的列。这种方法将过滤行和列选择结合在一个步骤中,这可以更有效,并且可以使代码更简洁。