在 power query 自定义列中引用上面的单元格
Referencing cell above in power query custom column
我正在努力将 Excel 进程转换为强大的查询自定义列,它目前的工作方式是引用上面的单元格写入当前单元格。
Excel 公式为 =IF(G2<>"", IF(I2<>"",I2,""),H1)
在此示例中,将在 H2 中输入。它本质上是说,当我的左边和右边有值的单元格时,我会把单元格的值写到右边,直到我看到左边的单元格没有与右边的单元格配对对,然后返回 null。这贯穿几千行,可能会被触发几十次来修补小洞。
最终结果基本上是这样的,中心列是我的新数据(出于视觉原因,我使用零而不是“”或 null):
- 0 0 0 - Write null
- 0 0 0 - Write null
- x 1 1 - Write value to the right
- 0 1 0 - Write value above
- 0 1 0 - Write value above
- x 0 0 - Write null
- 0 0 0 - Write null
现在我必须在执行查询链之前编写公式,我想将这一步合并到自定义列中,但我还没有找到解决方案。我完全是 m 代码和电源查询以及堆栈溢出的新手,但到目前为止,我已经能够执行我需要的每个步骤,除了这个步骤。
您可以添加索引列,然后访问当前索引减 1 处的单元格。例如,如果您添加索引列 Index
并将该步骤命名为 Table
,则访问前一行中 Column
列中的值 您将在自定义公式中使用此表达式:
if [Index] > 0 then Table[Column]{[Index] - 1} else some_default_value
some_default_value
将是您希望第一行的单元格成为的任何内容。在您的情况下,这可能是 null
。我们需要 if 语句,因为 table.
中没有行 -1
我的建议是另一种方法:
下面的查询基于具有 G、H 和 I 列的 Table1,它创建了前 2 个步骤。
下一列 H 已删除。
添加新列 H,如果 G 和 I 都为 <> null,则最初使用 I 的值,否则如果 G = null,则为空白(稍后将为 null)。
接下来填充新列 H。
下一个“”被替换为null。
最后对列进行了重新排序。
编辑:通过 UI 完成的所有步骤;选择 "Add Custom Column"
后,新列的公式被输入到公式框中(没有 "each ")
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"G", type text}, {"H", type any}, {"I", Int64.Type}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"H"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "H", each if [G] <> null and [I] <> null then [I] else if [G] <> null then "" else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"H"}),
#"Replaced Value" = Table.ReplaceValue(#"Filled Down","",null,Replacer.ReplaceValue,{"H"}),
#"Reordered Columns" = Table.ReorderColumns(#"Replaced Value",{"G", "H", "I"})
in
#"Reordered Columns"
我正在努力将 Excel 进程转换为强大的查询自定义列,它目前的工作方式是引用上面的单元格写入当前单元格。
Excel 公式为 =IF(G2<>"", IF(I2<>"",I2,""),H1) 在此示例中,将在 H2 中输入。它本质上是说,当我的左边和右边有值的单元格时,我会把单元格的值写到右边,直到我看到左边的单元格没有与右边的单元格配对对,然后返回 null。这贯穿几千行,可能会被触发几十次来修补小洞。 最终结果基本上是这样的,中心列是我的新数据(出于视觉原因,我使用零而不是“”或 null):
- 0 0 0 - Write null
- 0 0 0 - Write null
- x 1 1 - Write value to the right
- 0 1 0 - Write value above
- 0 1 0 - Write value above
- x 0 0 - Write null
- 0 0 0 - Write null
现在我必须在执行查询链之前编写公式,我想将这一步合并到自定义列中,但我还没有找到解决方案。我完全是 m 代码和电源查询以及堆栈溢出的新手,但到目前为止,我已经能够执行我需要的每个步骤,除了这个步骤。
您可以添加索引列,然后访问当前索引减 1 处的单元格。例如,如果您添加索引列 Index
并将该步骤命名为 Table
,则访问前一行中 Column
列中的值 您将在自定义公式中使用此表达式:
if [Index] > 0 then Table[Column]{[Index] - 1} else some_default_value
some_default_value
将是您希望第一行的单元格成为的任何内容。在您的情况下,这可能是 null
。我们需要 if 语句,因为 table.
我的建议是另一种方法:
下面的查询基于具有 G、H 和 I 列的 Table1,它创建了前 2 个步骤。
下一列 H 已删除。
添加新列 H,如果 G 和 I 都为 <> null,则最初使用 I 的值,否则如果 G = null,则为空白(稍后将为 null)。
接下来填充新列 H。
下一个“”被替换为null。
最后对列进行了重新排序。
编辑:通过 UI 完成的所有步骤;选择 "Add Custom Column"
后,新列的公式被输入到公式框中(没有 "each ")let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"G", type text}, {"H", type any}, {"I", Int64.Type}}),
#"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"H"}),
#"Added Custom" = Table.AddColumn(#"Removed Columns", "H", each if [G] <> null and [I] <> null then [I] else if [G] <> null then "" else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"H"}),
#"Replaced Value" = Table.ReplaceValue(#"Filled Down","",null,Replacer.ReplaceValue,{"H"}),
#"Reordered Columns" = Table.ReorderColumns(#"Replaced Value",{"G", "H", "I"})
in
#"Reordered Columns"