答案 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
它会给你预期的结果:
要求:数据(F3)之后的一个单元格必须为空。
[编辑]:工作原理
接近逻辑:
例如,对于第一个记录步骤,给出" 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之后,如果是,它会停止计数,如果没有则移动到下一个单元格。