优化计算产品的数组函数

我有以下数组公式计算特定股票在特定年份的收益:

=IF(AND(NOT(E2=E3),H2=H3),PRODUCT(IF($E$2:E2=E1,$O$2:O2,""))-1,"") 

但是,因为我有500,000行条目,当我打到行50,000时,我从Excel中得到一个错误,说明我的机器没有足够的资源来计算值。

我应该如何优化function,使其实际工作?

E栏是指一个计数器来检查股票的年份和股票价值。 如果年份与以前的值不同,函数将输出1 。 当股票名称改变时,它也会输出1 。 例如,你可能有1993年的价值,下一个价值是1993年,但是股票的名字是不同的,所以显然应该重新计算回报,我用1作为表示。

然后我有另外一列累计1秒。 当遇到前一列中的新的1时,我在运行总数中加1 ,并保持打印相同的数字,直到我观察到新数字。 这使得可能使用数组函数,如果包含运行总值(E列)的列有一个不同于以前的我使用我的捻在SUMIF但带有PRODUCT IF的值。 这将返回所有相应的正在运行的总E列值的乘积。

SO24335932问题的例子

我相信,效率低下的根源在于,为了评估每个连续的数组公式,必须检查的单元的行数稳步增加。 例如,在第50,000行中,您的公式必须检查其上方所有行中的单元格。

我是数组公式的忠实粉丝,所以我很难说这个,但我不会这样做。 相反,使用额外的列来计算每一行中您需要返回所需结果的公式。 通过采取这种方法,您可以利用Excel非常高效的重新计算引擎来计算所需的内容。

至于最终产品,计算从辅助列中的累积运行产品,并且当上面的行中的列P包含数字时,重置为现在在列O中的值。 这种方法更“本地”,避免依赖大量细胞的公式。

我意识到,文字并不是描述这一点的最佳语言,而我可怜的写作技巧可能会增加挑战性,所以请让我知道是否需要更多的细节。

有趣的问题,谢谢。

我可以build议一个非常快速和[非常]肮脏的VBA? 像下面的东西。 很明显,在运行这个文件之前先备份一下你的文件 。 这假设你想从第13行开始计算。

 Sub calculateP() 'start on row 13, column P: Cells(13, 16).Select 'loop through every row as long as column A is populated: Do If ActiveCell(1, -14).Value = "" Then Exit Do 'column A not populated so exit loop 'enter formula: Selection.FormulaR1C1 = _ "=IF(AND(NOT(RC[-11]=R[1]C[-11]),RC[-8]=R[1]C[-8]),PRODUCT(IF(R[-11]C5:RC[-11]=R[-1]C[-11],R2C15:RC[-1],""""))-1,"""")" 'convert cell value to value only (remove formula): ActiveCell.Value = ActiveCell.Value 'select next row: ActiveCell(2, 1).Select Loop End Sub 

对不起,这绝对不是一个很好的答案…其实,即使这种方法可以实现更优雅地使用范围…但是,快速和肮脏的方法可能会帮助你在过渡期?