在 Excel 中制作 CountRows 函数

Making a CountRows function in Excel

我正在尝试创建一个简单的 countRows 函数来计算动态范围内的单元格数量。基本上,如果我在单元格中有值,比如 B2:B500,计数将是 return 499。但是下一次值在单元格 B2:B501 中时,计数将是 return 500。但是您不必对您在其中键入公式的单元格执行任何操作。

我想如果我将单元格引用为 Variant,那么任何值都可以被接受。然后找到那个单元格的 AddressRange 的 return 的 Count。但是我收到 #Value 错误。

Public Function countRows(startRange As Variant)

    Dim rng As Range
    Set rng = startRange.Address


    If IsEmpty(Range(rng, rng.End(xlDown))) = True Then
        countRows = 1
    Else
        countRows = Range(rng, rng.End(xlDown)).Rows.Count
    End If

End Function

当您提到单元格 "B2:B500" 中有值并且计数应该 return 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 = 0.

    来解释为什么变量 "countRows" 没有被初始化

    某些编程语言如汇编语言、C、C++ 需要显式初始化。这是故意如此设计的,因为在这种哲学中,性能和安全之间的冲突通常以有利于性能的方式得到解决。

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

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

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

    在编码时,需要正确看待这一点,因为其他语言可能并非如此。

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

    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