有没有办法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的电子表格是一个维护头痛的问题