在两个动态范围中查找最大值

时间:2015-03-26 21:06:58

标签: excel excel-formula

我原来的问题并不像以前那么清晰,所以这里有一点澄清:

我正在使用的是在数据透视表中使用的项目列表。每行代表一个项目,一个人可以有多个项目,因此同一个人的名字出现在多行上。这些项目排名1-15。对于最终输出,我们要查找每个项目的个人数。我们希望每个人只计算一次,我们希望他们计入他们拥有的最高排名项目。最后,这给了我们一组个人,这些群体是每个人拥有的最高排名项目。

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

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

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

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

A    ...     F
Joe         1.2
Joe        12.7
Ralph       3.5
Ralph       4.1
Ralph       0.5
Warren     12.9
Mike        6.4
Mike        8.5
Ralph       1.3
Warren      7.9
Warren     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))

2 个答案:

答案 0 :(得分:1)

您不需要在此处找到MAX值 - 您只需要知道该特定列A值是否有更高的值。您可以使用COUNTIFS功能,这样更快,不需要"数组输入"并且,至关重要的是,它可以应用于整个列,没有明显的缺点。

基于此,您可以在G2复制下来使用此公式

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

这应该给你相同的结果,而不用担心数据的大小

答案 1 :(得分:0)

您应该能够使用INDIRECT将单元格地址作为字符串。

所以用{/ p>替换$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"))}