有没有办法缓存用作中间值的数组公式?

时间:2014-02-25 22:34:55

标签: excel excel-2007 formulas

TLDR:是否可以缓存数组,或者将数组存储在单个单元格中,以避免在单个公式中重新计算两次?


想象一下我定义了一个函数FilterEqual,它接受​​两个数组和一个常量作为输入,并返回第一个数组中的值,这些值对应于第二个中等于常量的值:

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的最新值(按日期)。换句话说,我的输出应该是,在这个例子中:

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)两次显然效率很低。 (整个事情实际上是低效的 - 从过滤器中获取一系列ID然后将它们索引到日期和值范围会更简洁 - 但是现在让我们忽略它。)


如果这是一个正常的公式,并且FilterEqual(Dates, IDs, $A2)是一些计算成本很高的值,我会将其缓存在一个中间列中:

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

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

是否可以缓存这样的中间数组值?


注意:

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

0 个答案:

没有答案