问题描述
Here is an example sheet which you should be able to make a copy of.
该表还包含有关该问题的更多详细信息。
但是...
问题的要点是我们有3列(B:D),理想情况下,我们希望将其设置为ARRAYFORMULAS,以便在添加新数据时不断地动态扩展它们。 (在这种情况下,每列都有一个数据,用于保存在A2:A中的日期)
这些列中唯一的“静态”输入是最初放置在B2中的数字。
然后需要根据B2中的编号生成单元C2和D2。在我们的 actual 工作表中,有一些相对复杂的逻辑可以进行生成,但是我可以肯定地确定,解决此问题的唯一“重要”依赖是对B2的依赖。
然后,需要根据B2,C2和D2中的数字生成单元格B3。这个逻辑真的 只是B2 + C2 + D2,这很好。我们遇到的问题是:
-
我们如何设置自引用的ARRAYFORMULA? (例如,如果ARRAYFORMULA从B3开始,那么它在B5中尝试写入的内容取决于什么?它写在B3,B4和B5中。) I can find some attempts of other people to solve this problem,but I don't really understand how to modify them for my use-case — can you?
很明显,如果每列中都有公式(例如B3 = B2 + C2 + D2,B4 = B3 + C3 + D3 ...),我们可以避免这些问题,但是
谢谢您的帮助!
这是在B3(using the link above)中编写自引用的ARRAYFORMULA的一种尝试,但是它给出了奇怪的结果,例如即使没有“衰减/匹配”更改负值,排名也会再次下降,这让我认为它没有正确地累积跟踪更改。但这可能有助于了解我的想法:
=ARRAY_CONSTRAIN(
ARRAYFORMULA( ARRAYFORMULA(INDIRECT("B2"&":b"&COUNTA(B2:B))) + C2:C + D2:D),DaysInRange,1)
解决方法
首先,我删除了所有未使用的行和列,这大大加快了速度。
然后我更改了数组公式。如果公式范围指定正确,我认为不需要 ARRAY-CONSTRAIN 函数。
所以试试这个。在 B 列的左侧插入一个空白列。设置新的 B2 = StartRank。 然后在单元格 B3 中:
=ARRAYFORMULA( IF(LEN(INDIRECT("A3:A"&COUNT(A2:A)+1)),INDIRECT("B2:B"&COUNT(A3:A)+1) +
INDIRECT("D2:D"&COUNT(A3:A)+1) +
INDIRECT("E2:E"&COUNT(A3:A)+1),""))
在 D2 中,计算衰减变化:
=ARRAYFORMULA(
IFS(A2:A = "","",C2:C > GKSheet1!RankCap,round( -1*GKSheet1!DecayPercent*ABS(GKSheet1!RankCap-C2:C)),C2:C < GKSheet1!RankFloor,round( GKSheet1!DecayPercent*ABS(GKSheet1!RankFloor-C2:C)),TRUE,0))
在 E2 中,计算匹配衰减:
=ARRAYFORMULA(
IFS(A2:A = "",B2:B > RankCap,F2:F * -10,B2:B < RankFloor,F2:F * 10,F2:F * 60))
我还更改了 A 列的日期公式。我认为唯一的缺点是它不会自动添加行。因此,如果您增加日期范围,即。将您的开始日期移至较早的日期,A 列将被填充,但如果您不添加更多行,则可能不会扩展到“今天”。
我在您的示例表中添加了一个标签 GKSheet1,但我认为我没有更改任何其他内容。它仍然很慢,但这可能是因为工作表中的其他标签。 Here is my sample,里面只有我的一个标签。重新计算大约需要十秒钟,开始日期大约是今天之前的一年 - 例如。如果我们在 2021 年 1 月,则使用 2020 年 1 月 1 日的开始日期。