【问题标题】:Structured Reference in an Index/Match Calculated Column Formula for Header Cell Range in a Table表中标题单元格范围的索引/匹配计算列公式中的结构化引用
【发布时间】:2016-07-15 22:31:24
【问题描述】:

我在计算列中有这个公式,效果很好:

=IFERROR(INDEX(Allocation_of_Funds[[#Headers],[End.Nursing]:[Unassigned14]],MATCH(TRUE,INDEX(Allocation_of_Funds[@[End.Nursing]:[Unassigned14]]>0,0),0)),"")

但是这个公式给我带来了麻烦,它代表了我在下一个计算列中想要的内容,(基于上面上一列中的值)但它返回一个#REF!错误:

=INDEX(INDIRECT("Allocation_of_Funds[[#Headers]"&"["&[@[SOURCE 1]]&"]"):[@Unassigned14],MATCH(TRUE,INDIRECT("Allocation_of_Funds[[#Headers]"&"["&[@[SOURCE 1]]&"]"):[@Unassigned14]>0,0),0)

表格设置的详细信息如下,以防有帮助:

我有一个包含一系列列的表格,每列代表不同类型的帐户。对于每一行,这些列的任何组合都可以包含值或空白,因此我还有另一组列,我想为每条记录的非空白列标识表列标题。

SOURCE1 | SOURCE2 | SOURCE3 | ACCT1 | ACCT2 | ACCT3 | ACCT4 | ACCT5
ACCT1   | ACCT2   | ACCT4   | 500   | 300   |       | 100   | 
ACCT2   | ACCT3   |         |       | 200   | 100   |       |       
ACCT3   |         |         |       |       | 500   |       | 
        |         |         |       |       |       |       | 
ACCT3   | ACCT4   | ACCT5   |       |       | 200   | 300   | 50
ACCT1   | ACCT3   | ACCT4   | 123   |       | 332   | 100   | 

所以我需要 SOURCE2 列来使用 SOURCE1 列中的值来识别我正在寻找具有值的下一个单元格的范围的开始,从而将为 SOURCE2 行返回高于该值的列标题价值。相同的公式将应用于 SOURCE3 列,使用 SOURCE2 列的值来标识下一个范围的开始。

提前感谢您挑选您的大脑!

-林赛

【问题讨论】:

  • 寻找最多 3 个来源?前三个来源?如果 acc7 和 acct 9 都有数字,那么您的表格中的预期结果是什么?
  • 我将有 5 个源列。是的,前 5 个来源。五个带有记录数据的帐户将被高估。大多数记录将只有一个带有数据的Acct 列,而有些记录将有2 或3 个。4 和5 不是预期的,但包括它们以备将来可能的扩展。该范围中有 50 多个帐户列。如果 Acct7 和 Acct9 都有非空格,那么 Source1 和 Source2 将返回“Acct7”和“Acct9”的值。
  • 问题在于我希望表头范围以与另一个单元格中的值同名的表头开头:Allocation_of_Funds[[#Headers],[VALUE OF ANOTHER CELL HERE] :[Unassigned14]]
  • 帐户栏的最大数量是多少?如果相邻帐户中有数字,会发生什么?
  • 最多 73 个帐户列。

标签: excel excel-formula excel-2013


【解决方案1】:

我使用以下公式拉出标题并将它们放在源编号下:

=IFERROR(INDEX($D$1:$H$1,AGGREGATE(15,6,COLUMN($D2:$H2)/ISNUMBER($D2:$H2)-COLUMN($D$1)+1,RIGHT(A$1,1)*1)),"")

我假设您的表格的左上角位于 A1 中,其中 1 是标题行,A-C 是您的源列,D 到 H 是帐户列。上面的公式可以放在单元格A2中,并根据需要向右和向下复制。

你似乎掌握了 IFERROR 和 INDEX 函数,所以我将解释 AGGREGATE 函数:

=AGGREGATE(15,6,COLUMN($D2:$H2)/ISNUMBER($D2:$H2)-COLUMN($D$1)+1,RIGHT(A$1,1)*1)

AGGREGATE 函数是一系列不同函数的混合体,可以忽略某些计算。另一个附加功能是,一些内置函数无需数组即可执行数组计算。

在这种特殊情况下,我选择了聚合函数 15,它与 SMALL 函数相同。我还告诉聚合忽略使用“6”产生错误的计算。对于数组计算,我已要求它将正在使用的列号除以该列的 True 或 False 结果是一个数字:

COLUMN($D2:$H2)/ISNUMBER($D2:$H2)-COLUMN($D$1)+1

Excel 数学中的 True 与 1 相同,False 与 0 相同。只要单元格不是数字,它就会尝试除以零,产生错误,并被 Aggregate 函数忽略。这基本上会生成一个列号列表,这些列号符合在其列中包含数字的标准。 D1 和 +1 的减法是将确定的列号转换为帐户标题下的相对列。

聚合函数的下一部分是告诉 SMALL 操作需要返回排序顺序中的哪个数字。我使用源标题中的最后一个字符来确定要返回的列号。对于 SOURCE1,最后一个字符是 1,所以我希望返回最小的列号。对于 SOURCE2,返回第二小的数字。末尾的 *1 将字符转换为数字而不是文本中的 1。

RIGHT(A$1,1)*1

Ergo,如果您想使用多达 9 个来源,您可以。你也可以做更多的来源,但你需要修改这个公式或想出一种不同的方式来提供你想要返回的小列表的数量。您可以将 D2:H2 引用扩展为您的所有帐户,并调整 D1:H1 引用以覆盖您的所有帐户标题。

概念证明

【讨论】:

  • 非常感谢你提供这个和所有的指导,如果我需要或在其他项目中使用相同的功能,我可以更进一步!我非常感谢 :) 但是,使用我提供的伪数据,它对于第 2 行和第 6 行并不完全有效。我不确定为什么。我将在上面的原始帖子中添加结果图片。
  • 我忘记了$来锁定操作的数组公式部分中的列引用。我已经更新了答案中的公式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2023-03-12
  • 1970-01-01
  • 2021-03-25
  • 2012-06-24
相关资源
最近更新 更多