Excel - 计算一行中第一个相邻的非零和非空值

时间:2017-06-07 20:44:25

标签: excel

我试图编写一个公式,它会计算一行中的数字(> 0)。

应该只计算一行中第一组> 0的数字。

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

示例:

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试找出非VBA解决方案很有趣。

1)在单元格H3中输入公式:

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

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

2)在单元格I3中输入公式:

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

它会给你预期的结果:

enter image description here

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

[编辑]:工作原理

接近逻辑:

  1. 对于每条记录,找到包含值>的第一个单元格的地址0
  2. 从此单元格地址开始,找到第一个单元格的位置为零或空白
  3. 期望的计数是在步骤2中找到的位置编号,少于1
  4. 例如,对于第一个记录步骤,给出" 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,...)然后在此数组中找到第一个TRUE的位置(3)。 ADDRESS通过将此位置添加到单元格B3来计算单元格地址(" B + 3,3" =" D3")。

    间接(H3):F3从细胞H3获取我们在第一个公式(" D3")中计算的细胞地址,并产生范围D3:F3。然后MATCH(INDEX())越过这个范围并在D3之后找到没有值(3)的第一个单元格的位置。因此,我们在第一个位置(D3),第二个位置(E3)具有值,在第三个位置(F3)没有值。 3 - 1 = 2个有值的位置。

答案 1 :(得分:1)

创建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之后,如果是,它会停止计数,如果没有则移动到下一个单元格。