在下面的示例数据中,我试图设置一个计数器,该计数器将返回连续的负值的数量,但仅对第一次出现的次数进行计数。
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
答案 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
用户定义的功能(UDF)非常容易安装和使用:
如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
要删除 UDF:
要使用来自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的原因。)
希望对您有帮助!