有朋友需要完成如下一个任务,编写在B3:C6范围内使用的公式以返回Date列的第一个和最后一个的日期。


返回第一个日期很容易,用Vlookup或者index函数即可以轻松实现(以下用两种方法实现):

B3= VLOOKUP(A3,A9:B19,2,0)

B4=INDEX(Date,MATCH(A4,Product,0))

但是,INDEX-MATCH无法找到列表中每个项目的最后一次出现的日期。这是因为MATCH( 匹配类型 等于零)返回未排序列表中的第一项。没有返回最后一项的版本。

但是,Excel的 SUMPRODUCT 函数提供了我们所需的功能。这是显示的单元格的公式:

C4= INDEX(B:B,SUMPRODUCT(MAX((Product=A3)*ROW(Product))))



乍看之下很难理解该公式。我们来看一下这个公式是如何得出结果的。

关键部分在于MAX函数,我们以C3单元格为例查看一下MAX函数内部发生了什么:

C3=INDEX(B:B,SUMPRODUCT(MAX({TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE}*{10;11;12;13;14;15;16;17;18;19})))

函数中(Product=A3)*ROW(Product)生成了如下两个数组:

{TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE}

{10;11;12;13;14;15;16;17;18;19}

下一步:INDEX(B:B,SUMPRODUCT(MAX({10;0;0;0;0;0;0;17;18;19})))

这里注意,在Excel中,TRUE为1,False为0,故两个数组相乘得出了如上结果。

最后,MAX返回最大值19,从面选择了B列的第19个单元格,值为2014/12/1

注意:这里的sumproduct作用是避免使用数组公式,如果去掉sumproduct则需要使用数组公式

C3={INDEX(B:B,MAX((Product=A3)*ROW(Product)))}