有朋友需要完成如下一个任务,编写在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)))}