只需添加另一个 if.. 应该这样做:
=IF(E2=1,IF(V2="W",98*T2-98,-100)
,IF(E2=2,IF(OR(V2="W",V3="W"),(((1/T2) / (1/T2+1/T3)*98)*T2)-98,-100)
,IF(E2=3,IF(OR(V2="W",V3="W",V4="W"),(((1/T2) / (1/T2+1/T3+1/T4)*98)*T2)-98,-100)
,IF(E2=4,IF(OR(V2="W",V3="W",V4="W",V5="W"),(((1/T2) / (1/T2+1/T3+1/T4+1/T5)*98)*T2)-98,-100)
,IF(E2=5,IF(OR(V2="W",V3="W",V4="W",V5="W",v6="W"),(((1/T2) / (1/T2+1/T3+1/T4+1/T5+1/T6)*98)*T2)-98,-100)
, "" )))))
或组合(相同的公式.. 仅在 1 行中):
=IF(E2=1,IF(V2="W",98*T2-98,-100) ,IF(E2=2,IF(OR(V2="W",V3="W"),(((1/T2) / (1/T2+1/T3)*98)*T2)-98,-100) ,IF(E2=3,IF(OR(V2="W",V3="W",V4="W"),(((1/T2) / (1/T2+1/T3+1/T4)*98)*T2)-98,-100) ,IF(E2=4,IF(OR(V2="W",V3="W",V4="W",V5="W"),(((1/T2) / (1/T2+1/T3+1/T4+1/T5)*98)*T2)-98,-100) ,IF(E2=5,IF(OR(V2="W",V3="W",V4="W",V5="W",v6="W"),(((1/T2) / (1/T2+1/T3+1/T4+1/T5+1/T6)*98)*T2)-98,-100) , "" )))))
更新:
取上述方程为[ExecutionFormula]。把上面的等式包起来:
=IF(
OR(
E1<>E2,
E2=1,
(ROW()>3)*(OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)="")*(E2=2),
(ROW()>4)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=3),
(ROW()>5)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=4),
(ROW()>6)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-4,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=5)
),
[ExecutionFormula]
,"")
或者在一行中:
=IF(OR( E1<>E2, E2=1, (ROW()>3)*(OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)="")*(E2=2), (ROW()>4)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=3), (ROW()>5)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=4), (ROW()>6)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-4,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E2=5)),IF(E2=1,IF(V2="W",98*T2-98,-100),IF(E2=2,IF(OR(V2="W",V3="W"),(((1/T2)/(1/T2+1/T3)*98)*T2)-98,-100),IF(E2=3,IF(OR(V2="W",V3="W",V4="W"),(((1/T2)/(1/T2+1/T3+1/T4)*98)*T2)-98,-100),IF(E2=4,IF(OR(V2="W",V3="W",V4="W",V5="W"),(((1/T2)/(1/T2+1/T3+1/T4+1/T5)*98)*T2)-98,-100),IF(E2=5,IF(OR(V2="W",V3="W",V4="W",V5="W",v6="W"),(((1/T2)/(1/T2+1/T3+1/T4+1/T5+1/T6)*98)*T2)-98,-100),""))))),"")
想法:使用 column() n row() 检查当前单元格地址并用作偏移量。在检查空白与 E2 值后,确定是否应该空白或进行计算。
更新 2:
你觉得 E26 合适吗?
恭喜..这是一次非常接近的尝试,但抱歉..不是这样。我将尝试解释这个东西是如何工作的,同时指导如何编辑它。编辑代码很容易,但从长远来看.. 理解是必要的(稍后进行故障排除/扩展)。我将从简单的开始,编辑代码。
到目前为止,我们已经看到了大图,公式是:
=if ( or(...), [ExecutionFormula] , "" )
所以有 2 部分一个是 ... ,另一个是 [ExecutionFormula] 。但我想用另一个名字来称呼他们(为了不明白的缘故)。所以... 是[ChkEmptyCell],而[ExecutionFormula] 现在是[RunMe]。有了这个,新的结构是:
= if ( [ChkEmptyCell] is true , [RunMe] , else "" )
重命名完成后.. 由于这个公式很冗长,我们需要一个工具来帮助我们进行括号跟踪。我使用记事本++,但您也可以使用https://pastebin.to/,这取决于您,但使用某些工具,缺少/多余的括号以后不会成为主要问题。
现在,我们查看[RunMe] 代码。我们知道 if() 是一个由 3 部分组成的函数,因此只需将它们清楚地分解。复制上面的第一个公式并将其粘贴到您选择的工具中,直到您在其中得到每个 if() 的分解。 [RunMe] 的基本结构是:
=IF ( E2=1 , <Do A> , IF ( E2=2 , <Do B> , "" ) )
所以扩展它..它会是
=IF ( E2=1 , <Do A> , IF ( E2=2 , <Do B> , IF ( E2=3 , <Do C> , IF ( E2=4 , <Do D> , IF ( E2=5 , <Do E> , IF ( E2=6 , <Do F> , "" ) ) ) ) ) )
完成 - 对于 [RunMe] 部分。
接下来,[ChkEmptyCell]。我们从第一个目的开始。
[ChkEmptyCell] 创建后检查当前单元格上方有多少空单元格。如果空单元格的数量可以,那么只做[RunMe],否则给一个空白。
[ChkEmptyCell]的结构是:
OR( <condition1>, <condition2>, <condition3>, <condition4>, <condition5>, <condition6> )
为了更简单的例子,我使用 E10 而不是 E2。与:
condition1 :
If ( E9 <> E10, [RunMe], "")
condition2 :
If ( E10 is 1, [RunMe], "")
condition3 :
If ( E10 is 2, AND E10 = E9 AND 1 cell above the current cell is empty, [RunMe], else "" )
condition4 :
If ( E10 is 3, AND E10 = E9 AND E9 = E8 AND the 2 cells above the current cell is empty, [RunMe], else "" )
condition5 :
If ( E10 is 4, AND E10 = E9 AND E9 = E8 AND E8 = E7 AND the 3 cells above the current cell is empty, [RunMe], else "" )
condition6 :
If ( E10 is 5, AND E10 = E9 AND E9 = E8 AND E8 = E7 AND E7 = E6 AND the 4 cells above the current cell is empty, [RunMe], else "" )
如您所见,对于条件4 到条件6,如果在E2 单元格中求值,则会导致错误。这就是为什么我们在逻辑中有(ROW()>3) 和IFERROR( ... , "")。它旨在“处理”前几行中的特殊情况。
至于OFFSET($A$1,(ROW()-1),COLUMN()-1),用于定义当前单元格位置。
所以OFFSET($A$1,(ROW()-1)-1,COLUMN()-1) 是当前单元格上方的一个单元格,OFFSET($A$1,(ROW()-1)-2,COLUMN()-1) 是当前单元格上方的两个单元格,以此类推。
这就是为什么要检查“当前单元格上方的1个单元格为空”(条件3),我们不需要连接。但是当我们想做“当前单元格上方的2个单元格为空”(条件4)时,我们需要concatenate (cell1,cell2)。
所以在条件3中,要检查“当前单元格上方的3个单元格为空”,我们执行concatenate (cell1,cell2,cell3),以此类推。
希望通过这一部分,您可以了解整个事情的运作方式。并有一些想法来“编辑”并结合[ChkEmptyCell] 并创建[Runme] 公式。在 E2=6 条件下,它的结构应该是这样的:
=IF(
OR( <condition1>,<condition2>,<condition3>,<condition4>,<condition5>,<condition6>,<condition7> )
,IF ( E2=1, <Do A>, IF ( E2=2, <Do B>, IF ( E2=3, <Do C>, IF ( E2=4, <Do D>, IF ( E2=5, <Do E>, IF ( E2=6, <Do F>, "" ))))))
, ""
)
如果您编辑问题并在官方问题中包含 E2=6(不在评论中),我将分享 E2=6 的答案。
希望它能清除一些空气..(:
更新 3:
AFAIK,你走上了正轨。你被困在我希望你被困在的地方。 d:
祝贺您的理解努力。真的很感激。保持。 ( :
基于“这样做的目的始终是检查荷兰人的利润”声明。我假设该公式适用于 BT 列。我还将假设该公式应用于 BT10 单元格。
所以得到的公式@BT10 是:
=IF(
OR(
E9<>E10,
E10=1,
(ROW()>3)*(OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)="")*(E10=2),
(ROW()>4)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E10=3),
(ROW()>5)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E10=4),
(ROW()>6)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-4,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="")*(E10=5)
)
,IF(E10=1,IF(V10="W",98*T10-98,-100),IF(E10=2,IF(OR(V10="W",V11="W"),(((1/T10)/(1/T10+1/T11)*98)*T10)-98,-100),IF(E10=3,IF(OR(V10="W",V11="W",V12="W"),(((1/T10)/(1/T10+1/T11+1/T12)*98)*T10)-98,-100),IF(E10=4,IF(OR(V10="W",V11="W",V12="W",V13="W"),(((1/T10)/(1/T10+1/T11+1/T12+1/T13)*98)*T10)-98,-100),IF(E10=5,IF(OR(V10="W",V11="W",V12="W",V13="W",V14="W"),(((1/T10)/(1/T10+1/T11+1/T12+1/T13+1/T14)*98)*T10)-98,-100),"")))))
,""
)
“我无法理解 [CheckEmptyCell] 的概念” [CheckEmptyCell] 在另一个概念中是一个相当高级的概念。我花了几天的时间试用。所以我真的不记得我测试了多少配方以及它是如何失败的。作为免责声明,如果我说得太低(在知识部分),请原谅我,这里是细分。
这是所有三个“概念”。
一:[获取当前单元格位置]
OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)
当前小区位置(使用上述假设)是 BT10。但是如何写If(BT9="",DoA,DoB)而不知道公式将在哪里应用?使用偏移行列功能的组合。
由于 A1 单元格的值为 ROW() = 1 & COLUMN() = 1 。所以 BT10 将有 ROW() = 10 & COLUMN() = 72 。所以如果我们想引用BT10,我们做OFFSET($A$1,(10-1),(72-1))。完毕。因此If(BT10="",DoA,DoB)可以写成If(OFFSET($A$1,(ROW()-1),COLUMN()-1) ="",DoA,DoB)。
注意到缺少的“-1”了吗?它用于指代 BT10 上方的 1 个单元格,即 BT9,因此 If(BT9="",DoA,DoB) 写为 If(OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)="",DoA,DoB) 。
为了引用上面的 2 个单元格 (BT8),我们添加了另一个行偏移量。等等。 (您已经注意到 condition3 vs condition4 condition5 ++ 中的这种偏移增量模式)
现在您应该注意到了.. 为什么我使用这种复杂的引用,而我可以通过在公式中手动输入“BT9”或“BT8”并向上/向下拖动来实现相同的目标?当我们将此公式应用于 BT2 时,问题就出现了,并且它“想要”检查其上方的 2 个单元格。由于单元格不存在,这将导致第一几行出错。
第一部分结束。
二:[ 为什么 OR() 看起来很奇怪? ]
[CheckEmptyCell] 方程的结构如下:
OR( <condition1>, <condition2>, <condition3>, <condition4>, <condition5>, <condition6> )
条件 1 和 2 是最容易获得的。
如果满足上述 2 个条件之一,则将运行 [Runme] 语句。好的。如果值为 2 并且重复(在 E9 和 E10 中)怎么办?如果 2 重复超过两次呢?
- condition3 [
(ROW()>3) * (OFFSET($A$1,(ROW()-1)-1,COLUMN()-1)="") * (E10=2) ] : 这里有 3 个术语 (term1)*(term2)*(term3) 。
"..如果值为 2 并且重复(在 E9 和 E10 中)?" > 条件 1 为假,条件 2 也是如此。
这里有两点需要注意。一是如果当前行“2”(在 E10 中)是出现的第二个“2”(在 E9 之后)......那么当前行应该是空的。
其次是(指“..if 2 is repeat more than two ?”),如果E8值也是'2',那么当前行必须[Runme],不能为空。
为了实现这一点,我们只需检查当前单元格 (BT10) 上方的单元格 (BT9) 是否为空,或者不使用“term2”。如果为空,则返回 TRUE ([RunMe]),否则返回 FALSE(空)。 ///\\
"term3" 很容易得到。但为什么是“term1”?
“term1”是说……这个(条件3)检查只会在第4行及以上进行,不会对第13行进行这样的“空单元格检查”。
"term4" ?!!这里没有明确定义,但 term4 间接引用 [E9=E10]。从技术上讲,条件 3 评估仅在 E9=E10 时有效。换句话说,在 OR(A,B,C) 中,只有当 A & B 为 FALSE 时,C 评估才具有一定的价值。这是从“数字电子学”主题讲座中学到的一些基本逻辑操作。
参考标记的 ///\\ 句子.. 不知何故,它 (term4) 确实:
(1) 如果 BT9 不为空,则间接验证 [ E9 = E10 ] & [ E9 = 2 & E10 = 2 ]。 & 它返回空白 (FALSE)。
(2) 如果 BT9 为空,则间接验证 [ E8 = E9 = E10 ] & [ E10 = '2']。 & 它返回 [RunMe] (TRUE)。
正如我所说.. 两者都没有在等式中明确输入,但必须为“E10 = 2 [RunMe] 逻辑”进行两项 term4 评估以适用于所有情况(例如,单/双/三重出现E 列中的“2”)。
好的。条件3结束。
下一步。
- condition4 [
(ROW()>4) * (CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="") * (E10=3) ] : 这里有 4 个术语 (term1)*(concatenate((term2a),(term2b))*(term3) 。
"term1",说明同上。此(条件4)检查仅在第 5 行及以上进行,不会对第 1 4 行进行此类“空单元格检查”。
“term3”,表示这个校验只对E10 = 3有效。
concatenate() 是为了迎合“如果 3 重复超过 3 次怎么办?”条件。所以对于'3'..使用“概念一”,我们现在知道:term2a 指的是 BT8 & term2b _ BT9。
我们只检查当前单元格(BT10)上方的2个单元格(BT8和BT9)是否为空,使用(concatenate((term2a),(term2b))。其中term2a指的是上面的BT8 / 2单元格) & term2b 指的是上面的 BT9/1 单元。
如果两者都为空,则返回 TRUE ([RunMe]),如果只有一个单元格 (BT9) 为空或两个单元格 (BT8 和 BT9) 都有值,则返回 FALSE(空)。 “term2a”在 iferror(,"") 中被扭曲,因为当输入 BT2 (row2) 时会出错,其中不存在参考单元格。 ////\\
“term4”也适用于此。请参阅标记的 ////\\ 语句。要发生 2 个“空”单元格(在 BT9 和 BT8 中),BT7 必须具有 [RunMe] 的值。因此,E7、E8 和 E9 的值必须为 3。间接地,对于 E10 = 3:
(1) 如果 BT9 不是空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=3 ]
(2) 如果 BT9 为空白且 BT8 不为空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=E8=3 ]
(3) 如果 BT9 & BT8 为空,则执行 [RunMe] (TRUE) 也已验证:[ E10=E9=E8=E7=3 ]
不能想当然地认为“term4”在这里扮演了相当大的角色。您可以看到,必须为“E10 = 3 [RunMe] 逻辑”完成上述所有评估才能适用于所有情况。 ( :
condition4 故事/概念结束。
- 条件5 [
(ROW()>5) * (CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="") * (E10=4)]:或(term1)*(concatenate((term2a),(term2b),(term2c))*(term3)。
term2a 指的是 BT7,term2b _ BT8 & term2c _ BT9。
所以对于条件 5 (E10=4),term4 听起来像这样:
(1) 如果 BT9 不是空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=4 ]
(2) 如果 BT9 为空白且 BT8 不为空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=E8=4 ]
(3) 如果 BT9 & BT8 为空白且 BT7 不为空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=E8=E7=4 ]
(4) 如果 BT9 & BT8 & BT7 为空,做 [RunMe] (TRUE) 也验证:[ E10=E9=E8=E7=E6=4 ]
- 条件6 [
(ROW()>6) * (CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-4,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-2,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))="") * (E10=5)]:或(term1)*(concatenate((term2a),(term2b),(term2c),(term2d))*(term3)。
其中 term2a 指的是 BT6、term2b _ BT7、term2c _ BT8 & term2d _ BT9。
对于条件6 (E10=5),term4 听起来像这样:
(1) 如果 BT9 不是空白,则空白当前单元格。 (FALSE) 也验证了:[ E10=E9=5 ]
(2) 如果 BT9 为空白且 BT8 不为空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=E8=5 ]
(3) 如果 BT9 & BT8 为空白且 BT7 不为空白,则空白当前单元格。 (FALSE) 也已验证:[ E10=E9=E8=E7=5 ]
(4) 如果 BT9 & BT8 & BT7 为空白且 BT6 不为空白,则将当前单元格空白。 (FALSE) 也已验证:[ E10=E9=E8=E7=E6=5 ]
(5) 如果 BT9 & BT8 & BT7 & BT6 为空,则执行 [RunMe] (TRUE) 也验证:[ E10=E9=E8=E7=E6=E5=5 ]
第二部分结束。
三:[整个冒险及超越]
到目前为止,这是我第一次花这么多时间测试案例,但最终得到的代码比预期的要短得多。正如您在上面看到的,“隐形”术语 4 实际上由很多规则组成,我们需要所有规则。具有讽刺意味的是,它是通过不直接定义来执行的(这是逻辑操作部分 - 关键字:布尔代数)。感谢您提出这个问题,这对我自己来说是一个相当大的修正。
超越 - 对于 E10=6,将 condition6 扩展为 (term1)*(concatenate((term2a),(term2b),(term2c),(term2d),(term2e))*(term3) 并将其添加到 [CheckEmptyCell] 中的 OR() 项中。
通过编辑(添加)您的问题来输入尝试过的公式。我很乐意看看/检查。 ( :
更新 4:
我觉得不使用上面的文字(没有代码行号)来解释有点困难。在这里,我将向您提供简化的解释(带有行号)。也是“E2 = 6”的完整解决方案。
在这里,我使用每个部分的行号。您可以并排打开两个代码以进行更好的比较。
这里是整个原始代码的结构:https://pastebin.com/yyv0xswq
这里是完整的代码:https://pastebin.com/gqjjhbV4
请注意,上述代码中的第 4 到 28 行(在完整代码中)是“condition1-condition6”,第 32 到 61 行是“动作 A 到 E”(我指的是 pastebin 中的行号) .
将其与整体附加 (E2=6) 代码的结构进行比较:https://pastebin.com/SUu5i4aJ
它的完整代码是:https://pastebin.com/EEdSgsZu
第 4 到 36 行是(在完整代码中)“condition1-condition7”(注意在 condition7 的连接中有一个带有“-5”的额外术语)& 第 41 到 74 行是“action A to上面代码中的 F"(我指的是 pastebin 中的行号)。
请测试解决方案是否有效。 ( :