不使用显式范围的数组公式
Array formulas that do not use explicit ranges
对于客户购买产品的每个实例,我都需要弄清楚该客户之前购买该产品的时间。我有一个使用数组公式的解决方案:
{=MAX(IF(($D:$D = [@Product])*($C:$C=[@Customer]) * ($E:$E<[@Date]),$E:$E,FALSE))}
我喜欢它,因为它不需要对数据进行排序(我想避免这个先决条件)但我对此并不完全满意,因为公式包括单元格范围(例如 $D:$D
)因此,如果以及何时将新交易添加到源数据中,我将需要更新公式。
一个可行的例子是 OneDrive 上的 here。
谁能想出更好的方法来消除数组公式中的那些范围?
将另一个条件添加到日期检索会更容易(并且非数组)切换到 AGGREGATE¹ function,其中任何不匹配的值都被强制为错误并忽略错误。
' in F3
=IFERROR(AGGREGATE(14, 6, ([Date])/(([Product]=[@Product])*([Customer]=[@Customer])*([Date]<[@Date])), 1), "")
' in G3
=IF([@PreviousPurchase]="", "", [@Date]-[@PreviousPurchase])
当无法确定之前的购买日期时,IFERROR function returns 一个零长度字符串(例如 ""
)。这就需要G3公式也要调整。
¹ AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。
尝试使用结构化引用而不是范围引用
{=MAX(IF((Table1[[#All],[Product]] = [@Product])*(Table1[[#All],[Customer]]=[@Customer]) * ( Table1[[#All],[Date]]<[@Date]),Table1[[#All],[Date]],FALSE))}
对于客户购买产品的每个实例,我都需要弄清楚该客户之前购买该产品的时间。我有一个使用数组公式的解决方案:
{=MAX(IF(($D:$D = [@Product])*($C:$C=[@Customer]) * ($E:$E<[@Date]),$E:$E,FALSE))}
我喜欢它,因为它不需要对数据进行排序(我想避免这个先决条件)但我对此并不完全满意,因为公式包括单元格范围(例如 $D:$D
)因此,如果以及何时将新交易添加到源数据中,我将需要更新公式。
一个可行的例子是 OneDrive 上的 here。
谁能想出更好的方法来消除数组公式中的那些范围?
将另一个条件添加到日期检索会更容易(并且非数组)切换到 AGGREGATE¹ function,其中任何不匹配的值都被强制为错误并忽略错误。
' in F3
=IFERROR(AGGREGATE(14, 6, ([Date])/(([Product]=[@Product])*([Customer]=[@Customer])*([Date]<[@Date])), 1), "")
' in G3
=IF([@PreviousPurchase]="", "", [@Date]-[@PreviousPurchase])
当无法确定之前的购买日期时,IFERROR function returns 一个零长度字符串(例如 ""
)。这就需要G3公式也要调整。
¹ AGGREGATE function 是在 Excel 2010 中引入的。它在早期版本中不可用。
尝试使用结构化引用而不是范围引用
{=MAX(IF((Table1[[#All],[Product]] = [@Product])*(Table1[[#All],[Customer]]=[@Customer]) * ( Table1[[#All],[Date]]<[@Date]),Table1[[#All],[Date]],FALSE))}