我正在尝试创建一个简单的countRows
函数,它将计算动态范围内的单元格数。基本上如果我在单元格中有值,比如B2:B500,则计数将返回499.但是下一次值在单元格B2中:B501,计数将返回500.但是你不必对此做任何事情。您在公式中键入的单元格。
我想如果我将单元格引用为Variant
,则可以接受任何值。然后找到该单元格的Address
并返回Count
的{{1}}。但我收到Range
错误。
#Value
答案 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,因为可能存在一些可能的情况:
Range("B2:B500").Rows.Count
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
。
编码时,需要保持透视,因为其他语言可能不同。