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

Excel-计算行中第一个相邻的非零值和非空值,excel,Excel,我正在尝试编写一个公式,它将计算一行中的数字(>0) 应仅对行中第一组大于0的数字进行计数 当>0数字后有0或空单元格时,计数应忽略下一个值 例如: 创建一个从左到右循环的列。将以下代码放在模块中,并像使用任何其他公式一样使用它。它有一个参数-行上的单元格范围 Function CountAdjacent(rng As Range) Dim x As Integer, result As Integer Dim ws As Worksheet Dim firstValuePassed As B

我正在尝试编写一个公式,它将计算一行中的数字(>0)

应仅对行中第一组大于0的数字进行计数

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

例如:

创建一个从左到右循环的列。将以下代码放在模块中,并像使用任何其他公式一样使用它。它有一个参数-行上的单元格范围

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
功能计数器相邻(rng As范围)
将x调整为整数,结果为整数
将ws设置为工作表
Dim FirstValues作为布尔值传递
设置ws=rng.Parent
对于x=rng.Column到rng.Column+rng.Columns.Count-1
如果ws.Cells(rng.Row,x)0而不是IsEmpty(ws.Cells(rng.Row,x)),那么
结果=结果+1
firstValuePassed=True
其他的
如果firstValuePassed=True,则退出
如果结束
下一个x
countnexture=结果
端函数
工作原理: x上的For循环从第一个选定列一直到最后一个选定列。如果遇到一个数字,则将结果递增1,并标记在firstValuePassed布尔值中遇到了一个数字,因为您希望数字中的任何间隙都可以停止计数。如果遇到零或空白单元格,它将对照firstValuePassed检查它是否位于数字>0之后,如果是,则停止计数,如果不是,则移动到下一个单元格。

创建一个单元格,以便从左到右循环列。将以下代码放在模块中,并像使用任何其他公式一样使用它。它有一个参数-行上的单元格范围

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
功能计数器相邻(rng As范围)
将x调整为整数,结果为整数
将ws设置为工作表
Dim FirstValues作为布尔值传递
设置ws=rng.Parent
对于x=rng.Column到rng.Column+rng.Columns.Count-1
如果ws.Cells(rng.Row,x)0而不是IsEmpty(ws.Cells(rng.Row,x)),那么
结果=结果+1
firstValuePassed=True
其他的
如果firstValuePassed=True,则退出
如果结束
下一个x
countnexture=结果
端函数
工作原理:
x上的For循环从第一个选定列一直到最后一个选定列。如果遇到一个数字,则将结果递增1,并标记在firstValuePassed布尔值中遇到了一个数字,因为您希望数字中的任何间隙都可以停止计数。如果遇到零或空白单元格,它将对照firstValuePassed检查它是否位于数字>0之后,如果是,它将停止计数,如果不是,它将移动到下一个单元格。

尝试找出一个非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
它将为您提供预期的结果:

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

[编辑]:它的工作原理

进近逻辑:

  • 对于每个记录,查找包含值>0的第一个单元格的地址
  • 从该单元格地址开始,查找第一个为零或为空的单元格的位置
  • 所需计数是在步骤2找到的位置编号,小于1
  • 例如,对于第一个记录,第一步给出第一个值的“D3”-单元格。步骤2计算“D3”后第一个没有值的单元格从位置3开始(D3有值,E3有值,F3为空)。因此,值计数为3-1=2(D3和E3中的值)

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


    间接(H3):F3从单元格H3获取我们在第一个公式(“D3”)中计算的单元格地址,并生成范围D3:F3。然后MATCH(INDEX())遍历该范围,并在D3之后找到第一个没有值(3)的单元格的位置。所以,我们在第一个位置(D3)有值,第二个位置(E3)有值,第三个位置(F3)没有值。3-1=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
    
    它将为您提供预期的结果:

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

    [编辑]:它的工作原理

    进近逻辑:

  • 对于每个记录,查找包含值>0的第一个单元格的地址
  • 从该单元格地址开始,查找第一个为零或为空的单元格的位置
  • 所需计数是在步骤2找到的位置编号,小于1
  • 例如,对于第一个记录,第一步给出第一个值的“D3”-单元格。步骤2计算“D3”后第一个没有值的单元格从位置3开始(D3有值,E3有值,F3为空)。因此,值计数为3-1=2(D3和E3中的值)

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


    间接(H3):F3从单元格H3获取我们在第一个公式(“D3”)中计算的单元格地址,并生成范围D3:F3。然后MATCH(INDEX())遍历该范围,并在D3之后找到第一个没有值(3)的单元格的位置。所以,我们在第一个位置(D3)有值,第二个位置(E3)有值,第三个位置(F3)没有值。3-1=2个有值的位置

    您能解释一下为什么第3行的结果是2,第6行的结果是2吗?第3行-第一个>0的数字是1,下一个是2。计数是2。第6行-fi