找到两个动态范围内的最大值
Find the maximum value in two dynamic ranges
我最初的问题并不像它可能的那样清楚,所以这里有一些澄清:
我正在处理的是一个在枢轴中使用的项目列表 table。每行代表一个项目,一个人可以有多个项目,所以同一个人的名字出现在多行。这些项目排名为 1-15。对于最终输出,我们正在寻找每个项目的个人数量。我们希望每个人只被计算一次,并且我们希望他们被计算为他们拥有的排名最高的项目。最后,这为我们提供了个人群体的统计,群体是每个人拥有的排名最高的项目。
人名在A列,排名在F列。我有一个公式可以找到每个A的最高F,但是当加载新数据并且总行数发生变化时它失败了。
这是我最初的问题,以及我使用的公式:
我有一个数组公式可以工作,除非 table 中的条目数发生变化。我知道如何找到最后一行,但我不知道如何将两者结合起来。详情如下:
我有一个 table 从另一个 sheet 上的动态更新查询中提取数据。它在 A 列中有重复的文本值,在 F 列中有唯一的数值。在 G 列中,我有一个数组公式。如果当前行的 F 值是对应 A 的最大 F,则 returns 1,如果不是 returns "No" (更容易在其他地方过滤和计算数字,不要'不要问)。
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:$A19=A2)*($F:$F19)),N(1),"No"))}
这个公式工作正常,除了条目的总范围可以在任何给定的一天发生变化。今天有 1718 行,加上列 headers。明天我可能有 1300 个条目,或者 2000 个(尽管永远不会超过 2000 个)。如果 A 列中有空行,则整个公式将失败,报表的其余部分将崩溃。
我知道我可以使用以下方法获取 A 列中带有文本的最后一行的编号:
=MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1
今天那个公式returns“1719”正是我想要的。在第一个公式中,您可以看到涉及该行号的两个单元格区域引用。
我想不通的是如何将两者结合起来。理论上我应该能够用涉及第二个公式的某种参考替换第一个公式中的 $A$2:$A$1719 参考,但我找不到一种可行的方法。有什么想法吗?
对于未来试图解决与我相同问题的迷失灵魂,有两个很好的答案。您可以在下面的答案中阅读详细信息,但这是快速参考。
如果你想通过我原来使用数组公式的方法来做到这一点,使用这个:
{=IF(A2="","",IF(F2=MAX((INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F:$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))
您应该能够使用 INDIRECT
,它将单元格地址作为字符串。
所以用
替换$A:$A19
INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))
并将$F:$F19
替换为
INDIRECT("$F:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))
最终输出应如下所示:
{=IF(A2="","",IF(F2=MAX((INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1)))),N(1),"No"))}
您实际上不需要在此处找到 MAX
值 - 您只需要知道该特定列 A 值是否有更高的值。您可以为此使用 COUNTIFS
函数,它更快,不需要 "array entry",而且至关重要的是,它可以应用于整个列而没有明显的缺点。
基于此你可以把这个公式在G2
复制下来
=IF(A2="","",IF(COUNTIFS(A:A,A2,F:F,">"&F2)>0,"No",1))
这应该会为您提供相同的结果,而无需担心数据的大小
我最初的问题并不像它可能的那样清楚,所以这里有一些澄清:
我正在处理的是一个在枢轴中使用的项目列表 table。每行代表一个项目,一个人可以有多个项目,所以同一个人的名字出现在多行。这些项目排名为 1-15。对于最终输出,我们正在寻找每个项目的个人数量。我们希望每个人只被计算一次,并且我们希望他们被计算为他们拥有的排名最高的项目。最后,这为我们提供了个人群体的统计,群体是每个人拥有的排名最高的项目。
人名在A列,排名在F列。我有一个公式可以找到每个A的最高F,但是当加载新数据并且总行数发生变化时它失败了。
这是我最初的问题,以及我使用的公式:
我有一个数组公式可以工作,除非 table 中的条目数发生变化。我知道如何找到最后一行,但我不知道如何将两者结合起来。详情如下:
我有一个 table 从另一个 sheet 上的动态更新查询中提取数据。它在 A 列中有重复的文本值,在 F 列中有唯一的数值。在 G 列中,我有一个数组公式。如果当前行的 F 值是对应 A 的最大 F,则 returns 1,如果不是 returns "No" (更容易在其他地方过滤和计算数字,不要'不要问)。
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:$A19=A2)*($F:$F19)),N(1),"No"))}
这个公式工作正常,除了条目的总范围可以在任何给定的一天发生变化。今天有 1718 行,加上列 headers。明天我可能有 1300 个条目,或者 2000 个(尽管永远不会超过 2000 个)。如果 A 列中有空行,则整个公式将失败,报表的其余部分将崩溃。
我知道我可以使用以下方法获取 A 列中带有文本的最后一行的编号:
=MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1
今天那个公式returns“1719”正是我想要的。在第一个公式中,您可以看到涉及该行号的两个单元格区域引用。
我想不通的是如何将两者结合起来。理论上我应该能够用涉及第二个公式的某种参考替换第一个公式中的 $A$2:$A$1719 参考,但我找不到一种可行的方法。有什么想法吗?
对于未来试图解决与我相同问题的迷失灵魂,有两个很好的答案。您可以在下面的答案中阅读详细信息,但这是快速参考。
如果你想通过我原来使用数组公式的方法来做到这一点,使用这个:
{=IF(A2="","",IF(F2=MAX((INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F:$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))
您应该能够使用 INDIRECT
,它将单元格地址作为字符串。
所以用
替换$A:$A19
INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))
并将$F:$F19
替换为
INDIRECT("$F:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))
最终输出应如下所示:
{=IF(A2="","",IF(F2=MAX((INDIRECT("$A:$A$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1))=A2)*(INDIRECT("$F:$F$" & (MATCH(TRUE, INDEX(ISBLANK('SourceQuery'!A1:A2001), 0, 0), 0)-1)))),N(1),"No"))}
您实际上不需要在此处找到 MAX
值 - 您只需要知道该特定列 A 值是否有更高的值。您可以为此使用 COUNTIFS
函数,它更快,不需要 "array entry",而且至关重要的是,它可以应用于整个列而没有明显的缺点。
基于此你可以把这个公式在G2
复制下来
=IF(A2="","",IF(COUNTIFS(A:A,A2,F:F,">"&F2)>0,"No",1))
这应该会为您提供相同的结果,而无需担心数据的大小