结合多个公式

时间:2019-12-14 07:58:30

标签: excel syntax nested

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

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

因此,基本上,如果E2 = 1,则运行计算1;如果E2 = 2,则运行计算2;否则,计算2。如果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语句嵌套,并有一些强制它只能在每个组的第一行进行计算。

我已经尝试了很长时间才能将它们组合在一起,但是却苦苦挣扎,因此希望这里的人对嵌套有更深入的了解,并且重要的是强制只在组的第一行执行计算。

非常感谢。

Spreadsheet Image

Spreadsheet Image


更新(这是我到目前为止所尝试的):

=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我仍然很难将其与添加的6行组一起使用。在您的答案中,对于E2 = 5,除了利润计算外没有其他公式,因此我以E2 = 4作为E2 = 6的起点。这是我尝试过的,也许您可​​以说是否对。 E2 = 4只是从原始公式复制而来

(E2=4), (ROW()>6)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-4,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-3,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))=“")*

为了保持格式不变,这就是我对6做的事情

(E2=6), (ROW()>8)*(CONCATENATE(IFERROR(OFFSET($A$1,(ROW()-1)-6,COLUMN()-1),""),IFERROR(OFFSET($A$1,(ROW()-1)-5,COLUMN()-1),""),OFFSET($A$1,(ROW()-1)-1,COLUMN()-1))=“”)*

但是,当我将其添加到原始公式并更改利润公式以反映另一行时,我没有任何结果。我也对E2 = 5感到困惑,因为它后面根本没有CONCATENATE参数。它直接进入利润计算。

E26对您来说合适吗?如果是这样,我将发布包含它的整个公式,并修改利润计算

欢呼

2 个答案:

答案 0 :(得分:0)

尽管您当然可以嵌套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 :如果计算速度较慢,并且您想避免使用易失性的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),
          "")

带有荷兰语结果的表

enter image description here

答案 1 :(得分:0)

只需添加另一个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)

,  ""  )))))

或组合(相同的公式..仅一行):

=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()检查当前单元格地址并用作偏移量。在检查空白vs E2值后,确定是否应该空白或进行计算。


更新2:

  

E26看起来合适吗?

恭喜您,..这是一次非常近距离的尝试,但是对不起。我将在指导如何编辑的同时,尝试解释它的工作原理。编辑代码很容易,但是从长远来看..理解是必要的(以后进行故障排除/扩展)。我将从简单的代码开始。

到目前为止,我们已经看到了BIG图片,公式为:

=if ( or(...),  [ExecutionFormula]  , ""  )

所以有2个部分,一个是...,另一个是[ExecutionFormula]。但是我想用另一个名字称呼他们(出于不知名的缘故)。因此...[ChkEmptyCell],而[ExecutionFormula]现在是[RunMe]。这样,新结构为:

= if ( [ChkEmptyCell] is true , [RunMe] , else "" )

重命名完成后..并且由于此公式非常简单,因此我们需要一个工具来帮助我们进行括号跟踪。我使用的是notepad ++,但您也可以使用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]。我们从目标1开始。

创建[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 "" )

如您所见,对于condition4到condition6,如果在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)是当前单元格上方的2个单元格,依此类推。

这就是为什么要检查“当前单元格上方的1个单元格为空”(condition3),我们不需要连接。但是当我们要执行“当前单元格上方的2个单元格为空”(条件4)时,我们需要concatenate (cell1,cell2)

因此,在condition3中,要检查“当前单元格上方的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>, IF ( E2=6, <Do G>, "" ))))))) 

    , "" 

    )

如果您编辑问题并在正式问题中加入E2 = 6,我将分享E2 = 6的答案(不在评论中)。

希望它可以清除空气。(: