Excel 如何对单元格进行计数,直到值大于0为止?

Excel 如何对单元格进行计数,直到值大于0为止?,excel,vba,Excel,Vba,在Excel中,我试图计算预约可用的天数 在下面的数据集中,我需要能够计数,直到达到一个不是0的值 我需要的结果是 例1=3 例2=5 例3=0 用通俗易懂的英语,我需要它来检查单元格是否为0,如果为,则对其进行计数,并在单元格不再为0时停止计数 如果有一个VBA解决方案是最好的,但我接受任何可行的方案 Example1 Example2 Example3 May 13 2019 0 0 2 May 14 2019 0

在Excel中,我试图计算预约可用的天数

在下面的数据集中,我需要能够计数,直到达到一个不是0的值

我需要的结果是

例1=3 例2=5 例3=0 用通俗易懂的英语,我需要它来检查单元格是否为0,如果为,则对其进行计数,并在单元格不再为0时停止计数

如果有一个VBA解决方案是最好的,但我接受任何可行的方案

Example1 Example2 Example3 May 13 2019 0 0 2 May 14 2019 0 0 0 May 15 2019 0 0 6 May 16 2019 6 0 0 May 17 2019 0 0 3 May 20 2019 3 7 0 May 21 2019 6 14 0 May 22 2019 6 0 1 May 23 2019 12 14 0 May 24 2019 7 0 0 像这样:

Public Function count_zeroes(ByVal columnID As Long) As Long
    Dim i As Long: i = 1
    Dim cell As Range: Set cell = ActiveSheet.Cells(i, columnID)

    If Not IsEmpty(cell) Then
       Do Until cell <> 0 'we'll keep counting until cell <> 0 
           i = i + 1
           Set cell = ActiveSheet.Cells(i, columnID)
       Loop
    End IF

    count_zeroes = i - 1

End Function
像这样:

Public Function count_zeroes(ByVal columnID As Long) As Long
    Dim i As Long: i = 1
    Dim cell As Range: Set cell = ActiveSheet.Cells(i, columnID)

    If Not IsEmpty(cell) Then
       Do Until cell <> 0 'we'll keep counting until cell <> 0 
           i = i + 1
           Set cell = ActiveSheet.Cells(i, columnID)
       Loop
    End IF

    count_zeroes = i - 1

End Function

您可以使用匹配公式=IFB20,0,MATCH0,B2:B20,1和升序编辑:添加,如果第一天不起作用,如果第一天是可用的

您可以使用匹配公式=IFB20,0,MATCH0,B2:B20,1和升序编辑:添加,如果这不起作用,如果第一天是可用的

也许最简单的方法是下一个公式:

=IFERROR(MATCH(0,B:B,1)-MATCH(0,B:B,0)+1;0)

假设我们正在处理B列上的数据。

也许最简单的方法是下一个公式:

=IFERROR(MATCH(0,B:B,1)-MATCH(0,B:B,0)+1;0)
假设我们正在处理B列上的数据

请注意,仅当选择1列数据时,此选项才有效。此外,我将其设置为字节类型,因此如果天数大于255,则会引发错误。如果需要,只需将其更改为整数即可

请注意,仅当选择1列数据时,此选项才有效。此外,我将其设置为字节类型,因此如果天数大于255,则会引发错误。如果需要,只需将其更改为整数。

公式

例如1,但编辑返回示例2和3

=MATCH(TRUE,INDEX($B$2:$B$11>0,0),0)-1
配方

例如1,但编辑返回示例2和3

=MATCH(TRUE,INDEX($B$2:$B$11>0,0),0)-1

另一个选择是使用数组公式,它在任何地方都可以工作,至少我认为它可以

{=MIN(IF(B4:B13>0,ROW(B4:B13)-MIN(ROW(B4:B13)),""))}

请确保使用Shift+Ctrl+Enter提交

还有一个使用数组公式的选项,它在任何地方都可以工作,至少我认为它可以

{=MIN(IF(B4:B13>0,ROW(B4:B13)-MIN(ROW(B4:B13)),""))}


确保使用Shift+Ctrl+Enter提交

您尝试了什么?您卡在哪里了?您是否尝试过在列中的单元格为0时使用while循环来递增计数器?如果您尝试得很好,请将其编辑到问题本身中。除其他外,这将使我们了解预期的输出是什么。您尝试过什么?您卡在哪里了?您是否尝试过在列中的单元格为0时使用while循环来递增计数器?如果您尝试得很好,请将其编辑到问题本身中。除其他外,这将让我们了解预期的输出是什么。如果列底部一直有零,会发生什么?因为这个原因,选择的数据类型是长的,而不是字节或整数。一旦它超过实际使用中不太可能出现的长最大值,就会导致溢出问题是如果一直存在零或空格,最终Cellsi、columnID将尝试访问不存在的单元格。溢出不是问题。这是一个边缘案例,所以如果需要处理它,这是一个判断调用。啊,我糟糕的忘记了空白单元格被处理为零,是的,应该用一个简单的ISEMPTY来命名。你仍然有行设置cell=ActiveSheet.Cellsi,columnID,在我可以是Rows.Count的情况下。此外,isEmpty仅应用于列中的顶部单元格。快速测试表明,您的代码会崩溃,例如,在第一行只有一个0的列上,下面的所有列都是空的。如果列底部都是零,会发生什么情况?因为这个原因,选择的数据类型很长,而不是字节或整数。一旦它超过实际使用中不太可能出现的长最大值,就会导致溢出问题是如果一直存在零或空格,最终Cellsi、columnID将尝试访问不存在的单元格。溢出不是问题。这是一个边缘案例,所以如果需要处理它,这是一个判断调用。啊,我糟糕的忘记了空白单元格被处理为零,是的,应该用一个简单的ISEMPTY来命名。你仍然有行设置cell=ActiveSheet.Cellsi,columnID,在我可以是Rows.Count的情况下。此外,isEmpty仅应用于列中的顶部单元格。快速测试表明,您的代码会崩溃,例如,在第一行只有一个0的列上,下面的所有列都是空的。使用Byte的动机是什么?根据,Byte消耗1个字节,Integer消耗4个字节。我有一个工作习惯,不确定这在英语中是否正确,也不确定我在哪里工作,因为时间安排很长,我们总是努力调整。我必须承认,在这个简单的过程中并不真正值得,但正如我所说,我已经习惯了,因为我的工作。这就是为什么我在后面添加了一个关于将其更改为整数的解释。希望这能给你带来一些启发。谢谢你,它工作得很好。我对VBA非常陌生,令人惊讶的是,我还没有接触到函数,但这迫使我学习并认为我是一个非常宝贵的教训,如果你在爱尔兰,我欠你一品脱哈:再次感谢你使用Byte的动机是什么?根据,Byt
e消耗1字节,Integer消耗4字节。我有一个工作习惯,不确定这在英语中是否正确,也不确定我在哪里工作,因为时间安排很长,我们总是努力调整。我必须承认,在这个简单的过程中并不真正值得,但正如我所说,我已经习惯了,因为我的工作。这就是为什么我在后面添加了一个关于将其更改为整数的解释。希望这能给你带来一些启发。谢谢你,它工作得很好。我对VBA非常陌生,令人惊讶的是,我还没有遇到函数,但这迫使我学习并认为我是一个非常宝贵的教训,如果你在爱尔兰,我欠你一品脱哈:再次感谢