答案1
如果我理解正确的话,这很简单。我相信你寻求的逻辑是:
如果这是某个日期的第一个实例,则 S 应等于 (v * w)。如果这不是该日期的第一个实例,则此行的 S 应等于该日期的第一个实例的 S 值。用伪代码 If-Then 表示如下:
IF (this row's date = previous row's date) THEN
This row's S = previous row's S
ELSE
This row's S = this row's V times this row's W
或者使用 Excel 引用,第 2 行的逻辑将是:
IF (A2 = A1) THEN
S2 = S1
ELSE
S2 = V2 * W2
一旦我们清楚地表达了逻辑,Excel 表达此逻辑的方式就是在单元格 S2 中放置此公式:
=IF(A2=A1,S1,V2*W2)
然后这个公式就被复制下来了。
我希望这能帮助您形成一种表达逻辑的方式,然后创建公式。
答案2
正如Max
所说。
如果您具有Spill
功能并且想要编写单个公式,则可以使用:
=IF(A2:A6 = A1:A5, V1:V5 * W1:W5, V2:V6 * W2:W6)
S1:S5
虽然使用TRUE 结果似乎更好,但这会导致Spill
公式出现循环。但只需将计算放在“上方”单元格中即可。
但... 并非在所有方面都适用。虽然它对于 A 列中日期的第二个实例很有效,但对于第三个实例却不起作用。但是,将 A 列中该行的日期与整个 A 列中日期的第一个实例进行匹配并返回该行的计算结果的查找将有效:
=IF(A2:A6=A1:A5, INDEX(V2:V6*W2:W6, MATCH(A2:A6,A2:A6,0), ), V2:V6*W2:W6)
这样就会给出Spill
结果,因此一个公式会填充所有需要的单元格,而不必在添加更多数据行时继续粘贴公式。
(但是,如果对无序日期进行类似处理,它将起作用,但如果 A 列中的某个日期与它上面的日期匹配,但不与它上面的日期匹配(因此第 100 行中的日期与第 32 行中的日期匹配,但第 99 行有其他日期),则将被视为一个新出现的日期,并进行不同的处理,则它将不起作用。)
(顺便说一句,请注意INDEX
公式中的即使没有给出任何类型的“物理”范围也能正常工作。这是因为它适用于计算公式中内置的数组。虽然很好,但有时这是一个问题,因为某些函数生成的数组长度有限。不必INDEX
担心,但有些函数确实如此,并且您的公式可能会给出非常错误的结果,而不是以某种明显的方式失败(尽管它们肯定会这样做!)。即使INDEX
给出了一个范围,公式仍将形成数组,然后使用它,而不是使用范围内的实际单元格。有时我想知道,如果您给出的INDEX
结果数组比列中单元格数 1,048,576 长,它会接受它,直接失败,还是只使用前 1,048,576 个值。似乎它应该会成功,因此可以创建和使用比电子表格本身提供的大得多的虚拟范围……嗯……)