在Excel中创建CountRows函数

时间:2017-07-29 17:03:00

标签: vba function count range excel-udf

我正在尝试创建一个简单的countRows函数,它将计算动态范围内的单元格数。基本上如果我在单元格中有值,比如B2:B500,则计数将返回499.但是下一次值在单元格B2中:B501,计数将返回500.但是你不必对此做任何事情。您在公式中键入的单元格。

我想如果我将单元格引用为Variant,则可以接受任何值。然后找到该单元格的Address并返回Count的{​​{1}}。但我收到Range错误。

#Value

2 个答案:

答案 0 :(得分:1)

这是我在许多不同工作表下成功使用多年的代码。它处理许多细胞,单个细胞或空细胞。

Public Function CountRows(ByRef r As Range) As Long
    If IsEmpty(r) Then
        CountRows = 0
    ElseIf IsEmpty(r.Offset(1, 0)) Then
        CountRows = 1
    Else
        CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.count
    End If
End Function

Public Function CountCols(ByRef r As Range) As Long
    If IsEmpty(r) Then
        CountCols = 0
    ElseIf IsEmpty(r.Offset(0, 1)) Then
        CountCols = 1
    Else
        CountCols = r.Worksheet.Range(r, r.End(xlToRight)).Columns.count
    End If
End Function

答案 1 :(得分:0)

目前还不完全清楚你在寻找什么,当你提到单元格“B2:B500”中有值时,计数应该返回499,因为可能存在一些可能的情况:

  • 您只想计算“B2:B500”范围内的行数。代码将是:
  • Range("B2:B500").Rows.Count
    

  • 您想要计算“B2:B500”范围内的非空白单元格。在这种情况下,如评论中所示:
  • WorksheetFunction.CountA(Range("B2:B500"))
    

  • 如您的代码rng.End(xlDown)中所示,您可能希望计算从“B2:B500”整个范围中的范围“B2”开始的连续非空白单元格。您可以创建这样的函数:
  • Public Function countRows(rng As Range) As Long
        Dim rw As Range
        For Each rw In rng
            If IsEmpty(rw) Then Exit For
            countRows = countRows + 1
        Next
    End Function
    

    <强>澄清

    根据后续评论,我认为值得解释为什么变量“countRows”未通过添加行countRows = 0进行初始化。

    汇编语言,C,C ++等某些编程语言需要显式初始化。这是故意设计的,原因在于性能和安全之间的冲突通常被解决,有利于绩效。

    但是,VBA或Java等其他编程语言并非如此。

    说到VBA,在宏运行期间,所有变量都被初始化为一个值。数值变量初始化为零,可变长度字符串初始化为零长度字符串(“”),固定长度字符串填充ASCII代码0.变量变量初始化为Empty。 Empty变量由数字上下文中的零和字符串上下文中的零长度字符串(“”)表示。

    因此,在上面的代码块中没有添加单独的代码行countRows = 0

    编码时,需要保持透视,因为其他语言可能不同。