不使用显式范围的数组公式

时间:2015-09-18 08:17:29

标签: excel array-formulas

对于购买产品的每个客户,我需要弄清楚该客户以前何时购买过该产品。我有一个使用数组公式的解决方案:

{=MAX(IF(($D$3:$D$15 = [@Product])*($C$3:$C$15=[@Customer]) * ($E$3:$E$15<[@Date]),$E$3:$E$15,FALSE))}

我喜欢它,因为它不要求对数据进行排序(我想避免这个先决条件)但我并不完全满意,因为公式包括单元格范围(例如$D$3:$D$15)因此,如果新的交易被添加到源数据中,我将需要更新公式。

一个有效的例子是OneDrive上的here

enter image description here

任何人都可以找到一种更好的方法,可以消除数组公式中的那些范围吗?

2 个答案:

答案 0 :(得分:2)

尝试使用结构化引用而不是范围引用

{= MAX(IF((表1 [[全部],[产品]] = [@Product])*(表1 [[#All],[客户]] = [@客户])*(表1 [ [#ALL],[日期〕25; [@日期]),表1 [[#全部],[日期]],FALSE))}

答案 1 :(得分:1)

为日期检索添加另一个条件会更容易(并且非数组)切换到AGGREGATE¹ function,其中任何非匹配值被强制为错误并忽略错误。

' in F3
=IFERROR(AGGREGATE(14, 6, ([Date])/(([Product]=[@Product])*([Customer]=[@Customer])*([Date]<[@Date])), 1), "")
' in G3
=IF([@PreviousPurchase]="", "", [@Date]-[@PreviousPurchase])

Last purchase date

当没有可以确定之前的购买日期时,IFERROR function会返回零长度字符串(例如"")。这要求同样调整G3公式。

¹ Excel 2010引入了AGGREGATE function。早期版本不提供。

示例返回到:http://1drv.ms/1gwJ8wH