计算通过条件的连续值的首次出现

时间:2018-08-28 10:38:35

标签: excel excel-formula

在下面的示例数据中,我试图设置一个计数器,该计数器将返回连续的负值的数量,但仅对第一次出现的次数进行计数。

32 19 4 293 -30 -2 -5 -25 29 58 74 -90 -73 -62

在这种情况下,我希望函数返回4(将连续的负值从-30计数到-25,而完全忽略从-90到-62的值)

我得到了第一个负值的索引,但是我不知道如何从那里计算连续值。有人可以帮忙吗?

编辑:

到目前为止,我有以下公式:

=COUNTIF(INDEX(R3:EQ3,MATCH(TRUE,INDEX(R3:EQ3<0,),0)),"<0")

使用原始示例对此进行解释:

此公式在此范围内找到第一个负值-30,然后返回该值的索引。然后,Countif转到该索引,并检查它是否为负,并对其计数。但是,此公式不会计算之后的-2,-5和-25,并且当前始终返回1。

我需要它找到-30,对其进行计数,然后对一些直线之后的其他负值进行计数。

下面显示了我想在示例范围内计算的值。

 N  N N   N   Y  Y  Y   Y  N  N  N   N   N   N
32 19 4 293 -30 -2 -5 -25 29 58 74 -90 -73 -62
           This is counted       This is ignored

3 个答案:

答案 0 :(得分:1)

只要您的数据集没有它的第一个负值实例以列XFD(最后一列)结尾,您就可以使用以下数组公式:

=MATCH(TRUE,INDEX(1:1,1,MATCH(TRUE,1:1<0,0)):INDEX(1:1,1,16384)>=0,0)-1
  

将公式中的行引用更改为要测试的行。

     

未经修改,该公式不能与要检查的数据输入同一行,否则会出现循环引用错误

     

要输入/确认数组公式,请在按下 enter 的同时按住 ctrl + shift 。如果正确执行此操作,Excel会在公式栏中显示的公式周围放置括号{...}

答案 1 :(得分:0)

尝试以下用户定义功能:

Public Function consec(rng As Range) As Long
    Dim r As Range, StartCount As Boolean
    consec = 0
    StartCount = False
    For Each r In rng
        If StartCount Then
            If r.Value < 0 Then
                consec = consec + 1
            Else
                Exit Function
            End If
        Else
            If r.Value < 0 Then
                StartCount = True
                consec = 1
            End If
        End If
    Next r
End Function

enter image description here

用户定义的功能(UDF)非常容易安装和使用:

  1. ALT-F11弹出VBE窗口
  2. ALT-I ALT-M打开一个新模块
  3. 将内容粘贴并关闭VBE窗口

如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

删除 UDF:

  1. 如上调出VBE窗口
  2. 清除代码
  3. 关闭VBE窗口

使用来自Excel的UDF,

= consec(A1:Z1)

要全面了解有关宏的更多信息,请参见:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

,有关UDF的详细信息,请参见:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

必须启用宏才能使其正常工作!

答案 2 :(得分:0)

我猜想和罗恩的公式一样,但这没有什么解释

考虑到您的数据位于单元格A1:O1中,并且您在范围的中间或结尾处都有一些正值,那么此数组公式将起作用。

  

= MATCH(TRUE,INDIRECT(ADDRESS(1,MATCH(TRUE,A1:O1 <0,0),4)&“:O1”)> 0,0)-1

MATCH(TRUE,A1:O1 <0,0)-我们正在尝试查找列表中第一个负数的位置。

外部MATCH正在寻找在第一个负数之后的正数。

即计数从负数开始到正数,如果第一个正数在2个连续的负数之后,则返回3(这就是为什么末尾需要减1的原因。)

希望对您有帮助!