在 Excel 中制作 CountRows 函数
Making a CountRows function in Excel
我正在尝试创建一个简单的 countRows
函数来计算动态范围内的单元格数量。基本上,如果我在单元格中有值,比如 B2:B500,计数将是 return 499。但是下一次值在单元格 B2:B501 中时,计数将是 return 500。但是您不必对您在其中键入公式的单元格执行任何操作。
我想如果我将单元格引用为 Variant
,那么任何值都可以被接受。然后找到那个单元格的 Address
和 Range
的 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
我正在尝试创建一个简单的 countRows
函数来计算动态范围内的单元格数量。基本上,如果我在单元格中有值,比如 B2:B500,计数将是 return 499。但是下一次值在单元格 B2:B501 中时,计数将是 return 500。但是您不必对您在其中键入公式的单元格执行任何操作。
我想如果我将单元格引用为 Variant
,那么任何值都可以被接受。然后找到那个单元格的 Address
和 Range
的 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 时,您并不完全清楚您在寻找什么,因为可能存在几种可能的情况:
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 = 0
.
某些编程语言如汇编语言、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