【问题标题】:Find the maximum value in two dynamic ranges找出两个动态范围内的最大值
【发布时间】:2015-03-26 21:06:58
【问题描述】:

我最初的问题并没有想象中那么清楚,所以这里有一点澄清:

我正在使用的是用于数据透视表的项目列表。每行代表一个项目,一个人可以有多个项目,所以同一个人的名字出现在多行。项目排名 1-15。对于最终输出,我们正在寻找每个项目的个人计数。我们希望每个人都被计算一次,并且我们希望他们被计算为他们拥有的最高排名的项目。最后,这为我们提供了个人群体的统计数据,这些群体是每个人拥有的排名最高的项目。

人名在 A 列,排名在 F 列。我有一个公式可以找到每个 A 的最高 F,但是在加载新数据并且总行数发生变化时它失败了。

这是我最初的问题,以及我正在使用的公式:

我有一个有效的数组公式,除非表中的条目数发生变化。我知道如何找到最后一行,但我不知道如何将两者结合起来。以下是详细信息:

我有一个表,它从另一个工作表上的动态更新查询中提取数据。它在 A 列中有重复的文本值,在 F 列中有唯一的数值。在 G 列中,我有一个数组公式。如果当前行的 F 值是对应 A 的最大 F,则返回 1,否则返回“No”(更容易过滤和计算其他地方的数字,不要问)。

A ... F
乔 1.2
乔 12.7
拉尔夫 3.5
拉尔夫 4.1
拉尔夫 0.5
沃伦 12.9
迈克 6.4
迈克 8.5
拉尔夫 1.3
沃伦 7.9
沃伦 14.8
{=IF(A2="","",IF(F2=MAX(($A$2:$A$1719=A2)*($F$2:$F$1719)),N(1),"No"))}

这个公式可以正常工作,只是条目的总范围可以在任何一天发生变化。今天有 1718 行,加上列标题。明天我可以有 1300 个条目,或者 2000 个(尽管永远不会超过 2000 个)。如果 A 列中有空行,则整个公式将失败,报表的其余部分将折叠。

我知道我可以使用以下方法获取 A 列中最后一行的编号:

=MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1

今天,该公式返回“1719”,这正是我想要的。在第一个公式中,您可以看到两个涉及该行号的单元格区域引用。

我不知道如何将两者结合起来。从理论上讲,我应该能够将第一个公式中的 $A$2:$A$1719 引用替换为涉及第二个公式的某种引用,但我找不到可行的方法。有什么想法吗?

对于试图解决与我相同的问题的未来迷失的灵魂,有两个很好的答案。您可以在下面的答案中阅读详细信息,但这里是快速参考。

如果您想通过我使用数组公式的原始方法来执行此操作,请使用: {=IF(A2="","",IF(F2=MAX((INDIRECT("$A$2:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F$2:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1)))),N(1),"No"))}

如果你不想像我一样成为一个疯狂的人,你根本不需要使用数组公式。 =IF(A2="","",IF(COUNTIFS(A:A,A2,F:F,">"&F2)>0,"No",1))

【问题讨论】:

  • 我使用的主题行可能有点误导,但我想不出一个真正准确的问题总结。我想要的是找到与重复 A 值的任何给定实例相对应的所有 F 值的最大值,但是必须检查的总范围每天都在变化(并且 A 值的重复不一定接近列表中的彼此)。这更有意义吗?
  • 为了进一步澄清,以防将来人们面临类似的问题,我正在使用的是用于数据透视表的项目列表。每行是一个项目,一个人可以有多个项目,所以同一个人的名字出现在多行。这些项目排名 1-15,我们正在寻找每个项目的个人计数。我们希望每个人只被计算一次,并且我们希望他们获得他们拥有的最高排名的项目。无论如何,我在下面有两个答案都有效。
  • 我不介意对我的问题进行澄清。任何可以帮助像我一样困惑的未来人。

标签: excel excel-formula


【解决方案1】:

您实际上并不需要在这里找到MAX 值 - 您只需要知道该特定列 A 值是否有更高的值。您可以为此使用COUNTIFS 函数,该函数速度更快,不需要“数组输入”,而且至关重要的是,它可以应用于整个列而没有明显的缺点。

基于此,您可以将G2中的这个公式复制下来

=IF(A2="","",IF(COUNTIFS(A:A,A2,F:F,">"&F2)>0,"No",1))

这应该会给您相同的结果,而无需担心数据的大小

【讨论】:

  • 太完美了。比我解决问题的方式更简洁。
【解决方案2】:

您应该可以使用INDIRECT,它将单元格地址作为字符串接收。

所以将$A$2:$A$1719替换为

INDIRECT("$A$2:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))

并将$F$2:$F$1719替换为

INDIRECT("$F$2:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))

最终输出应如下所示:

{=IF(A2="","",IF(F2=MAX((INDIRECT("$A$2:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F$2:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1)))),N(1),"No"))}

【讨论】:

  • 啊,我以为我可以用 'INDIRECT' 做点什么,但我不知道如何让它发挥作用。现在我明白我做错了什么。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2022-01-04
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多