有没有办法caching一个数组公式作为中间值?

TLDR:是否可以caching数组,或将数组作为结果存储在单个单元中,以避免在单个公式中重新计算两次?


想象一下,我已经定义了一个函数FilterEqual ,它接受两个数组和一个常量作为input,并返回第一个数组中对应于第二个数值的常数值:

 FilterEqual(xs, ys, z) FilterEqual := [x for x,y in zip(xs,ys) if y == z] 

我有以下(相关)结构的数据:

 ID Date Value 1 01/01/2011 3 2 09/01/2013 5 2 08/02/2014 33 3 03/04/2012 91 3 01/02/2000 26 

我正在寻找获得给定ID的最新值(按date)。 换句话说,在这个例子中,我的输出应该是:

 ID Latest_Value 1 3 2 33 3 91 

使用我的FilterEqual函数,我可以在单元格B2中使用以下公式实现此目的:

 B2 := INDEX(FilterEqual(Values, IDs, $A2), MATCH(MAX(FilterEqual(Dates, IDs, $A2)), FilterEqual(Dates, IDs, $A2))) 

但是,计算FilterEqual(Dates, IDs, $A2)显然是效率低下的两倍。 (整个事情实际上效率低下 – 从filter中获取一个ID数组,然后将它们编入date和值范围 – 但是现在就忽略这个)。


如果这是一个正常的公式,并且FilterEqual(Dates, IDs, $A2)是一些昂贵的计算值,我会将其caching在中间列:

 ID Intermediate Latest_Value 1 _ 3 2 _ 33 3 _ 91 

但是,如果我尝试使用FilterEqual(Dates, IDs, $A2) (它是一个数组)的结果,单元格将只存储数组的第一个值(而不是整个数组)。

是否有可能caching这样的中间数组值?


笔记:

  • 一个命名的公式是不适合的,除非它可以被参数化(有成千上万的行,所以每一行的单个公式不起作用)
  • 这可以在VBA中轻松完成,但我宁愿尽可能避免这种情况,因为我发现过度使用VBA的电子表格是一个维护头痛的问题