Excel – 统计第一个相邻的非零值和非空值

我试图写一个公式,它将连续数字(> 0)。

只有连续第一组> 0的数字应该被计算在内。

当> 0号之后有一个0或一个空单元格时,计数应忽略下一个值。

例:

在这里输入图像说明

创build一个UDF,以便从左到右循环访问列。 将下面的代码放在模块中,并像其他公式一样使用它。 它有一个论据 – 行中单元格的范围。

Function CountAdjacent(rng As Range) Dim x As Integer, result As Integer Dim ws As Worksheet Dim firstValuePassed As Boolean Set ws = rng.Parent For x = rng.Column To rng.Column + rng.Columns.Count - 1 If ws.Cells(rng.Row, x) <> 0 And Not IsEmpty(ws.Cells(rng.Row, x)) Then result = result + 1 firstValuePassed = True Else If firstValuePassed = True Then Exit For End If Next x CountAdjacent = result End Function 

工作原理:x上的For循环从第一个选定列到最后一个。 如果遇到一个数字,它会将结果递增1,并标记在firstValuePassed布尔值中遇到了一个数字,因为您希望数字中的任何间隔都可以停止计数。 如果它遇到一个零或空白的单元格,它会检查firstValuePassed,看它是否在数字> 0之后,如果是,则停止计数,否则移动到下一个单元格。

试图找出非VBA解决scheme很有趣。

1)在单元格H3中input公式:

 =ADDRESS(ROW(B3),COLUMN(B3)+MATCH(TRUE,INDEX(B3:E3>0,0),0)-1) 

它将生成一个单元格地址(“D3”),在其行中包含第一个值> 0。

2)在单元格I3中input公式:

 =MATCH(TRUE,INDEX(INDIRECT(H3):F3=0,0),0)-1 

它会给你预期的结果:

在这里输入图像说明

要求:数据(F3)之后的一个单元格必须为空。

[编辑]:它是如何工作的

方法逻辑:

  1. 对于每个logging,find包含值> 0的第一个单元格的地址
  2. 从这个单元格地址开始,find零或空白的第一个单元格的位置
  3. 期望的计数是在步骤2find的位置编号,小于1

例如,对于第一个logging步骤,给出“D3” – 第一个值的单元格。 步骤2计算在“D3”之后没有值的第一个单元在位置3开始(D3具有值,E3具有值,F3为空白)。 因此,值计数为3 – 1 = 2(D3和E3中的值)。

公式如何工作:INDEX(B3:E3> 0,0)比较范围B3:E3到0(空格被视为0)中的每个单元格,并将结果作为布尔数组{FALSE,FALSE,TRUE,TRUE}返回。 MATCH(TRUE,…)然后在这个数组(3)中find第一个TRUE的位置。 ADDRESS通过将此位置添加到单元格B3(“B + 3,3”=“D3”)来计算单元格地址。

间接(H3):F3取自我们在单元格H3中的第一个公式(“D3”)中计算的单元格地址,并生成范围D3:F3。 然后MATCH(INDEX())越过这个范围,find第一个单元格的位置,在D3之后没有值(3)。 所以我们在第一个位置(D3),第二个位置(E3)有价值,第三个位置(F3)没有价值。 3 – 1 = 2个值的位置。