Excel-计算行中第一个相邻的非零值和非空值
我正在尝试编写一个公式,它将计算一行中的数字(>0) 应仅对行中第一组大于0的数字进行计数 当>0数字后有0或空单元格时,计数应忽略下一个值 例如: 创建一个从左到右循环的列。将以下代码放在模块中,并像使用任何其他公式一样使用它。它有一个参数-行上的单元格范围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
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)后面的一个单元格必须为空
[编辑]:它的工作原理
进近逻辑:
间接(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)后面的一个单元格必须为空
[编辑]:它的工作原理
进近逻辑:
间接(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