0

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

我想如果我将单元格引用为Variant,那么任何值都可以接受。然后找到Address那个单元格的 并返回Counta 的Range。但我得到一个#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
4

2 回答 2

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
于 2017-07-30T22:15:27.813 回答
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”没有通过添加 line 来初始化countRows = 0

    某些编程语言(如汇编语言、C、C++)需要显式初始化。之所以如此设计,是因为性能和安全之间的冲突通常以有利于性能的方式解决。

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

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

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

    在编码时,需要注意这一点,因为其他语言可能并非如此。

    于 2017-07-29T20:23:03.330 回答