【问题标题】:Combine multiple formulas组合多个公式
【发布时间】:2019-12-14 07:58:30
【问题描述】:

我需要能够在 Excel 电子表格中计算结果,并编写了 5 个单独的公式来涵盖可能的选择数量。简而言之,这种技术被称为Dutching,如果一组行中的任何一个选择获胜,则利润是相同的。

为了识别组,E 列有一个 COUNTIFS 公式,该公式比较 A 列和 B 列中的日期和时间,并计算有多少匹配。计数的结果从 1 到 5 不等。任何带 1 的东西都是事件中的单一选择;如果是 2、3、4 和 5,这意味着在同一事件中运行的选择组。我现在写了 5 个单独的公式可以计算每个组的利润,问题是计算需要粘贴到正确组的第一行才能达到预期的结果。由于有超过 10,000 行,这确实很麻烦,我希望从 5 个公式中创建一个公式。这个公式自然需要识别组并将公式仅应用于组的第一行。

所以基本上,如果 E2=1,则运行计算 1; IF E2=2 然后运行计算 2; IF E2=3 运行 3 以此类推。

这里有 5 个独立的公式,它们都可以独立工作:-

单选

=IF(V2="W",98*T2-98,-100)

对于一组 2 行

=IF(OR(V2="W",V3="W"),(((1/T2) / (1/T2+1/T3)*98)*T2)-98,-100)

一组 3 行

=IF(OR(V2="W",V3="W",V4="W"),(((1/T2) / (1/T2+1/T3+1/T4)*98)*T2)-98,-100)

一组 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)

一组 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)

因此,如果任何公式在不在组第一行的单元格上运行,它自然无法正确计算,因为它从顶部倒数,所以我真的需要 IF(OR 语句被嵌套并有一些东西迫使它只计算每组的第一行。

我已经尝试了很长时间将它们放在一起,但我苦苦挣扎,所以我希望这里有人对嵌套有更深入的了解,以及强制计算仅在组中的第一行执行的重要事情。

提前非常感谢。


更新(这是我迄今为止尝试过的):

=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(INDIRECT("H"&ROW()-4),""),IFERROR(INDIRECT("H"&ROW()-3),""),IFERROR(INDIRECT("H"&ROW()-2),""),INDIRECT("H"&ROW()-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),IF(E2=6,IF(OR(V2="W",V3="W",V4="W",V5="W”,V6=“W”, V7=“W"),(((1/T2)/(1/T2+1/T3+1/T4+1/T5+1/T6+1/T7)*98)*T2)-98,-100),""))))),"")

@p-phidot 我已经开始尝试创建公式的 [RunMe] 部分,然后再尝试其他部分。我正在这样做是另一张具有不同单元格引用的工作表,尽管这不应该成为问题。我还决定不对任何 1、2、3、4、5 和 6 进行公式检查。这样做的目的始终是检查荷兰人的利润,这实际上意味着使用超过 1 个选择,所以刚刚决定从等式中消除 1。

这是我汇总的内容,虽然只是作为一个直接公式,但在粘贴到第 2 行的单元格时不会给出结果

=IF(E2=2,IF(OR(K2="W",K3="W"),(((1/I2) / (1/I2+1/I3)*98)*I2)-98,-100) ,IF(E2=3,IF(OR(K2="W",K3="W",K4="W"),(((1/I2) / (1/I2+1/I3+1/I4)*98)*I2)-98,-100) ,IF(E2=4,IF(OR(K2="W",K3="W",K4="W",K5="W"),(((1/I2) / (1/I2+1/I3+1/I4+1/I5)*98)*I2)-98,-100) ,IF(E2=5,IF(OR(K2="W",K3="W",K4="W",K5="W",K6="W"),(((1/I2) / (1/I2+1/I3+1/I4+1/I5+1/I6)*98)*I2)-98,-100)) ,IF(E2=6,IF(OR(K2="W",K3="W",K4="W",K5="W",K6="W",K7="W"),(((1/I2) / (1/I2+1/I3+1/I4+1/I5+1/I6+1/I7)*98)*I2)-98,-100)  ,  ""  )))))

这看起来有什么不对吗?

干杯

【问题讨论】:

  • 我发现了一些不能让你的方程 4 和 5 起作用的东西,它是“符号.. 错误地输入(这里,有问题)为”和“。它应该是”。

标签: excel syntax nested


【解决方案1】:

虽然您当然可以嵌套 IF,这可能更容易理解,但请尝试:

=IF(COUNTIF(V2:INDEX(V2:V6,E1),"W")=E1,1/SUM(1/T2:INDEX(T2:T6,E1))*98-98,-100)

该公式创建了动态范围,既可以检查E1,也可以创建您的公式(通过排除一些无关因素进行了一些简化)。

一般的嵌套格式是这样的:

=if(e1=1,formula1,
    if(e1=2, formula2, …

您的公式以 V2:V6 范围内的“W”计数开始,该计数应与 E1 中的值匹配,因此我们可以在构建动态范围时使用它。

编辑:

在您阐明数据问题和预期结果后,我制定了以下解决方案。

我将您的输入变成了一个表格并使用了结构化引用,以便比尝试使用动态范围引用更清楚。

我也在使用OFFSET 函数,但如果速度成为问题,我们可能希望将其更改为非易失性INDEX 函数,但我今天早上没有时间。

某些结果与您显示的结果略有不同。我认为这是由于您的真实数据四舍五入造成的。

公式逻辑与我的第一个相同,只是逻辑上发生了变化,以判断何时输出任何数据,而不是输出计算或-100

公式(假设表格从A1开始):

=IF(OR(Table1[@[Date]:[Time]]<>A1:B1),IF(OR(OFFSET([@Result],0,0,[@Occurrences])="W"),1/SUM(1/OFFSET([@BSP],0,0,[@Occurrences]))*98-98,-100),"")

如果表格不是以A1 开头,请更改术语A1:B1 以反映真实数据的DateTime 列标题单元格。 (如果Date/Time 单元格不相邻,则可能需要不同的术语)。并确保使用A1 引用样式并且NOT 引用[#Header] 行,因为我们需要调整此引用以始终在公式填写时引用上面的行。

EDIT2:如果计算速度很慢,并且你想避免使用 volatile OFFSET 函数,下面使用 INDEX 函数来创建我们的动态范围,并且是非不稳定,所以应该更快:

=IF(OR(Table1[@[Date]:[Time]]<>A1:B1),
    IF(OR((([@Result]):INDEX([Result],ROW()-1-ROW(Table1[#Headers])+[@Occurrences]))="W"),
       1/SUM(1/(([@BSP]):INDEX([BSP],ROW()-1-ROW(Table1[#Headers])+[@Occurrences])))*98-98,-100),
          "")

荷兰语结果表

【讨论】:

  • 干杯罗恩。不幸的是,初始公式为单行组提供了正确的结果,但多行的所有组都显示为 -100,即使是在 E 列中有 W 的那些。-100 的结果也在组的每个单元格中,而不是就在第一个单元格中(甚至是带有“W”的行)。因此,如果它是一组 4 行,则每行显示为 -100,而不是该结果仅显示在该组的第一个单元格中。但是,它必须接近,因为计算对于单行是正确的。
  • @honkin 然后使用第二种嵌套方法。或者编辑您的问题以提供一个示例,如果您真的需要什么。也许您没有正确使用该公式,因为它是根据您提供的公式工作的。
  • 第二种方法完全忽略了对行组的识别,因此对于 10,000+ 行,这根本不可行,因为这意味着手动将正确的公式粘贴到每个组的第一行。除了单行之外,您的公式似乎没有计算任何内容。我刚刚针对每组行运行每个公式,手动将它们粘贴到每组的第一行。一切都按他们应该的方式工作,尽管与像这样的组之间复制的任何东西一样,一些“W”变成了“W”,所以我不得不修复“.除此之外,它们都工作正常。我将粘贴一个工作示例
  • 嗨 Ron 我刚刚添加了一张工作表的屏幕截图。它显示每组 2、3 和 4 行的结果。我没有打扰单行,因为它们工作正常。我将这些公式手动添加到每个组的第一行,因为如果将其粘贴到任何其他行中,它不会正确计算。这就是为什么这种方法如此繁琐的原因,因为它是劳动密集型的。当您的公式粘贴到下一列时,所有结果都是 -100,所以有些地方不太正确。表格有一个标题行。
  • 哦,你知道,对于这张特殊的表格,行数仍然在 E 中,但 W 或 L 现在在 K 中,价格计算是从 I 完成的。正如我所说,我将您的公式粘贴在荷兰语旁边的列中...确保列和行引用正确并将其粘贴到列中。所有结果均为-100。欢呼
【解决方案2】:

只需添加另一个 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()&gt;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 是最容易获得的。

  • condition1 [E9&lt;&gt;E10] :表示如果当前行 E 值与前一行不同,则给它一个 TRUE。 >> 所以[RunMe]。

  • condition2 [E10=1] :如果当前行 E 值为 1,则给它一个 TRUE。 >> 所以[RunMe]。

如果满足上述 2 个条件之一,则将运行 [Runme] 语句。好的。如果值为 2 并且重复(在 E9 和 E10 中)怎么办?如果 2 重复超过两次呢?

  • condition3 [ (ROW()&gt;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()&gt;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()&gt;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()&gt;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 中的行号)。

请测试解决方案是否有效。 ( :

【讨论】:

  • 欢呼并感谢您的回复@p._phidot。不,这会在每个单元格中放置一个结果,因此它无法解决此处的行组的关键问题。每组只需要一个结果;有 1、2、3、4 和 5 行的组,结果只是在每组的第一行。感谢您的努力
  • 好的。著名的。但是生成的值(在所需位置@每组的顶行)是否正确?
  • 顺便说一句,试试更新的解决方案。我真的希望这会有所帮助。
  • @p_phidot 这绝对是完美的。它对每组行的第一行进行所有计算。在粘贴所有内容时,我注意到在 10000+ 行中有 2 组,每组 6 行;我以前没有注意到它们。所以这个公式是 99% 正确的,但是漏掉了最后一部分;当他们是一组 6 时的计算。它和其他人一样,只是增加了 6 行。 =IF(OR(V2="W",V3="W",V4=“W”,V5=“W”,V6="W", V7="W"),(((1/T2) / (1/T2+1/T3+1/T4+1/T5+1/T6+1/T7)*98)*T2)-98,-100) 我不知道如何将其添加到您的公式中,但其余的都很棒
  • 您可以尝试.. 无论如何您都已经接近了.. 只要您能遵循逻辑.. 您可以在此处看到“包装”公式和堆叠-if 公式的模式.. 想要试试 ?见我here(在线120分钟)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多