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)之后的一个单元格必须为空。
[编辑]:它是如何工作的
方法逻辑:
- 对于每个logging,find包含值> 0的第一个单元格的地址
- 从这个单元格地址开始,find零或空白的第一个单元格的位置
- 期望的计数是在步骤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个值的位置。