优化计算产品的数组函数
我有以下数组公式计算特定股票在特定年份的收益:
=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列值的乘积。
我相信,效率低下的根源在于,为了评估每个连续的数组公式,必须检查的单元的行数稳步增加。 例如,在第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
对不起,这绝对不是一个很好的答案…其实,即使这种方法可以实现更优雅地使用范围…但是,快速和肮脏的方法可能会帮助你在过渡期?