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

我已经多次searchfind我的问题的正确的公式。 但是,我不能根据需要得到准确或精确的结果。 让我给你看一个我的数据样本

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

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

  • 值应该是比来自ColB的值更低的值。 (如2014年,如果2013年存在,那么它应该返回2013年,否则下一年。)
  • 只能从相同的行中捕获较低的值,根据ColA的值设置标识
  • 尽可能地,公式不应该是一个数组公式,为更好的performance,因为我正在处理大量的数据
  • 如果没有更低的值,它应该返回一个空白。

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

 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)} 

我试着做一个数组formula =LARGE(array,k) ,这有助于我的excel文件的性能下降。 如果可能的话,我真的希望得到一个公式(而不是数组),以获得所需的结果。

希望有人能够直接回答我,或者至less让我以正确的方式。

感谢大家!

看来你需要提供k2的伪LARGEIF()函数。 如果您使用INDEX生成了一个值的数组,那么将与A列不匹配或与B列等于或大于等于 B的任何值归零,那么您正在查找的值将是该数组的MAX 。 如果要在没有有效返回值的单元格中显示空string,则必须使用IF语句对零进行testing。

 =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功能

如果您使用的是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函数将其转换为空白。 “数组input”不是必需的

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

 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,"")即:引用上面的1行,而不是下面。

否则,我怀疑你可能被卡住了一个数组公式,因为你隐式地返回一个数组,在'返回所有的ColB值与ColA值匹配的当前ColA值'阶段,然后你做'然后find下一个最低ColB值“。