计算满足标准的块的公式

时间:2015-09-29 11:45:11

标签: excel excel-formula

我有一个过去12个月及以下的日期范围,每个客户的日期范围是“开”或“关”值。我基本上希望在重新开始之前计算好几天的每个“关闭”期间。

实施例

Col A        01/01/2014      02/01/2014     03/01/2014   04/01/2014  
1               off              off           on            off
2               on               off           off           off
3               on               on            on             on

所以基本上在每行日期结束时我想要另外六列第1块到第6块(第6块将永远是最大值)所以对于上面的ID 1已经关闭了两天,然后再次打开和关闭,所以我希望最后的列看起来像:

Col A         Block 1      Block 2      Block 3      Block 4      etc etc 
1                 2           1            -             -
2                 3           -            -             -
3                 -           -            -             - 

每次他们重新获益,然后再回来,开始一个新的阻止。这有什么简单的方法吗?我有近800k的行,真的不想手动执行此操作

2 个答案:

答案 0 :(得分:1)

我已经设法使用数组公式自行完成,我现在还不能理解UDF使用之前的答案。

=IFERROR(SMALL(IF(($A3:$OF3="Off")*($B3:$OG3<>"Off"),COLUMN($B3:$OG3),""),OJ$1)-SMALL(IF(($A3:$OF3<>"Off")*($B3:$OG3="Off"),COLUMN($B3:$OG3),""),OJ$1),"")

这似乎适用于1到6的辅助列

我已经检查了近6000行数据的结果,并且似乎完美没有发现任何问题。

感谢您的帮助

答案 1 :(得分:0)

您可以使用以下用户定义的函数来实现此结果。

如果您不熟悉UDF,可以按照本教程进行操作:

http://www.wikihow.com/Create-a-User-Defined-Function-in-Microsoft-Excel

Function CountBlock(v As Variant) As Variant
    Dim output(1 To 6) As Variant
    Dim cell As Variant

    Dim count As Integer
    Dim i As Integer

    i = 1

    For Each cell In v
        If cell = "off" Then
            count = count + 1
        ElseIf i = 6 Then
            Exit For
        ElseIf count > 0 Then
            output(i) = count
            i = i + 1
            count = 0
        End If
    Next

    output(i) = count
    CountBlock = output

End Function

结果将作为数组输出,因此您将使用&#34;数组公式&#34;共6件。只需选择6个连续的单元格。然后写=CountBlock(B2:E2)并执行control+Enter