根据多个条件查找或获取第二个较低值

时间:2014-10-10 05:50:13

标签: excel excel-formula excel-2010

我已多次搜索以找到问题的正确公式。但是,根据需要,我无法准确或准确地获得它。让我向您展示我的数据样本

ColA   ColB
-----------
BCD2   2009
ABC1   2012
BCD2   2013
ABC1   2011
XYZ3   2013
ABC1   2014
XYZ3   2014

从这组数据中,ColC应返回每行的值(下一个较低年份)。标准是:

  • 值应该是下一个低于ColB值的值。 (例如,2014年,如果2013年存在则应返回2013年,否则为下一年度。)
  • 只应从相同的行捕获较低的值,根据ColA
  • 的值设置标识
  • 尽可能地,公式不应该是数组公式,以便在我处理大量数据时获得更好的性能
  • 如果没有较低的值,则应返回空白。

然后根据上述标准,我必须得到以下结果:

ColA   ColB   ColC
-----------   ----
BCD2   2009   
ABC1   2012   2011
BCD2   2013   2009
ABC1   2011   
XYZ3   2013   
ABC1   2014   2012
XYZ3   2014   2013

到目前为止我已尝试过:

{=LARGE(IF(A2:A11=A2,B2:B11,""),COUNTIF(B2:B11,MAX(B2:B11))+1)}

我尝试过使用数组公式=LARGE(array,k),这会导致我的Excel文件性能下降。如果可能的话,我真的希望得到一个公式(不是数组),以获得理想的结果。

希望有人可以直截了当地回答我,或者至少引导我走正确的路。

谢谢大家!

3 个答案:

答案 0 :(得分:2)

如果您使用的是excel 2010或更高版本,可以尝试在C2中复制使用 AGGREGATE 这样的功能

=IFERROR(AGGREGATE(14,6,B$2:B$11/(A$2:A$11=A2)/(B$2:B$11< B2),1),"")

AGGREGATE函数可以使用多个计算。 14相当于 LARGE ,因此它给出了符合标准的最大值,同时忽略了错误(6)。如果没有这样的值,则返回错误(#NUM!),因此可以使用 IFERROR 函数将其转换为空白。 &#34;数组输入&#34;不是必需的

答案 1 :(得分:1)

如果您可以按ColA升序和ColB降序排序,则可以使用行偏移。所以制作你的数据:

ColA    ColB
ABC1    2014
ABC1    2012
ABC1    2011
BCD2    2013
BCD2    2009
XYZ3    2014
XYZ3    2013

然后你可以做一个简单的if语句,例如(在C2中,然后向下拖动):

=IF(A2=A3,B3,"")

那将返回:

ColA    ColB    ColC
ABC1    2014    2012
ABC1    2012    2011
ABC1    2011    
BCD2    2013    2009
BCD2    2009    
XYZ3    2014    2013
XYZ3    2013    

如果您有ColA升序和ColB升序,只需将其调整为=IF(A2=A1,B1,""),即:引用上面的一行,而不是下面的行。

否则,我怀疑你可能会遇到一个数组公式,因为你在'返回所有ColB值并且ColA值与当前ColA值匹配'阶段之前隐式返回一个数组,然后再执行'然后找到下一个最低的ColB值'。

答案 2 :(得分:1)

您似乎需要将 k 的伪LARGEIF()功能提供为 2 。如果您使用INDEX生成了一个值数组,这些值将与A列不匹配的任何内容归零,或者等于或大于到B列,那么您要查找的值将是该数组的MAX。如果要在没有有效返回的单元格中显示空字符串,则必须使用IF语句测试零。

=IF(COUNTIFS($A$2:$A$8,$A2,$B$2:$B$8,"<"&B2),MAX(INDEX((B$2:B$8)*($A$2:$A$8=$A2)*(B$2:B$8<$B2),,)),"")

LARGEIF functionality