如何根据A列中的特定字符串在B列中查找最小值和最大值?

时间:2016-02-04 22:48:56

标签: excel excel-vba excel-formula vba

我在A列中有一个项目列表,并且分别在B列和C列中有相应的年份和月份值。我希望在B列中找到最小和最大年份(基于A列中的特定值),然后在C列中找到相应的月份(仅用于最大值和最小值),然后生成并填写开始日期和结束日期分别在E列和F列中。 例如。如果@Item =笔记本电脑那么找到@YEAR的MIN,MAX,然后找到@Month中的相邻值。最后相应地制定并显示日期。 我可以使用公式实现这一点,还是超出范围,使用宏更好?

enter image description here

2 个答案:

答案 0 :(得分:3)

对于开始日期,在E2中:

=IF(A2<>A1,DATE(AGGREGATE(15,6,$B$1:$B$1000/($A$1:$A$1000=A2),1),AGGREGATE(15,6,$C$1:$C$1000/(($A$1:$A$1000=A2)*($B$1:$B$1000 = AGGREGATE(15,6,$B$1:$B$1000/($A$1:$A$1000=A2),1))),1),1),"")

对于F2中的结束日期:

=IF(A2<>A1,EOMONTH(DATE(AGGREGATE(14,6,$B$1:$B$1000/($A$1:$A$1000=A2),1),AGGREGATE(14,6,$C$1:$C$1000/(($A$1:$A$1000=A2)*($B$1:$B$1000 = AGGREGATE(14,6,$B$1:$B$1000/($A$1:$A$1000=A2),1))),1),1),0),"")

然后复制所需的行。

汇总功能于2010年推出,因此无法在excel 2007或更早版本中使用。

enter image description here

我认为他们可以简化为:

=IF(A2<>A1,AGGREGATE(15,6,DATE($B$1:$B$1000,$C$1:$C$1000,1)/($A$1:$A$1000=A2),1),"")

=IF(A2<>A1,AGGREGATE(14,6,EOMONTH(DATE($B$1:$B$1000,$C$1:$C$1000,1),0)/($A$1:$A$1000=A2),1),"")

感谢@Jerry提供更简洁的方法。

答案 1 :(得分:3)

我认为以下内容适用于任何版本的Excel,并且由于@ScottCarver的注释,您现在可以将其复制下来并将日期放在每个项目的第一行:

在E2中输入此作为数组公式,然后向下复制:

=IF(A2<>A1,MIN(IF(A:A=A2,DATE(B:B,C:C,1))),"")

在F2中输入此作为数组公式,然后复制:

=IF(A2<>A1,MAX(IF(A:A=A2,DATE(B:B,C:C+1,0))),"")

因为这些是数组公式,所以你需要按control-shift-enter而不是输入。输入后,它们将被{}包围,表示它们是数组公式。

原始答案:

我认为以下内容适用于任何版本的Excel,但您无法将其复制下来 - 您必须为每个项目单独输入一个。如果你真的希望它们展开,以便日期在第一次出现的项目的行上(就像你的截图中那样),那么这对你来说真的不适用。

对于笔记本电脑项目的开始日期:

=MIN(IF(A:A="Laptop",DATE(B:B,C:C,1)))

对于笔记本电脑项目的结束日期:

=MAX(IF(A:A="Laptop",DATE(B:B,C:C+1,0)))

这些是数组公式,因此您需要按control-shift-enter而不是输入。输入后,它们将被{}包围,表示它们是数组公式。