VBA – Range.Row.Count

我写了一个简单的代码来说明我的困境。

Sub test() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("Sheet1") Dim k As Long k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count End Sub 

会发生什么呢?我们对包含从A1开始的值的行进行计数。 如果包含值的行数大于1,则代码工作良好。 但是,如果A1是唯一包含任何值的单元格,则k = 1,048,576,我猜是Excel中允许的最大行数。

为什么不k = 1?

图片:

代码工作

这是错误的

编辑:我使用的解决方法如下:

 Sub test() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("Sheet1") Dim k As Long k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count If k = 1048576 Then k = 1 End If MsgBox (k) End Sub 

由于当值为1的行数为1时,k总是等于1048576,所以感觉有点傻,不得不这样做。

可能更好的解决scheme是从底部向上工作:

 k=sh.Range("A1048576").end(xlUp).row 

你应该像这样使用UsedRange

 Sub test() Dim sh As Worksheet Dim rn As Range Set sh = ThisWorkbook.Sheets("Sheet1") Dim k As Long Set rn = sh.UsedRange k = rn.Rows.Count + rn.Row - 1 End Sub 

+ rn.Row - 1部分是因为UsedRange只在第一行和第一列开始,所以如果你有第3行到第10行,但第1行和第2行是空的, rn.Rows.Count将是8

你也可以使用Ron de Bruin的“Last”function( http://www.rondebruin.nl/win/s9/win005.htm ),它对我来说是完美的,并且如果你想要的话还给出最后一列和单元格。 为了得到最后一行使用它

 lastRow = Last(1,yourRange) 

我发现这很方便。

 Function Last(choice As Long, rng As Range) 'Ron de Bruin, 5 May 2008 ' 1 = last row ' 2 = last column ' 3 = last cell Dim lrw As Long Dim lcol As Long Select Case choice Case 1: On Error Resume Next Last = rng.Find(What:="*", _ After:=rng.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row On Error GoTo 0 Case 2: On Error Resume Next Last = rng.Find(What:="*", _ After:=rng.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column On Error GoTo 0 Case 3: On Error Resume Next lrw = rng.Find(What:="*", _ After:=rng.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row On Error GoTo 0 On Error Resume Next lcol = rng.Find(What:="*", _ After:=rng.Cells(1), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Column On Error GoTo 0 On Error Resume Next Last = rng.Parent.Cells(lrw, lcol).Address(False, False) If Err.Number > 0 Then Last = rng.Cells(1).Address(False, False) Err.Clear End If On Error GoTo 0 End Select End Function 
 CountRows = ThisWorkbook.Worksheets(1).Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count 
 k = sh.Range("A2", sh.Range("A1").End(xlDown)).Rows.Count 

要么

 k = sh.Range("A2", sh.Range("A1").End(xlDown)).Cells.Count 

要么

 k = sh.Range("A2", sh.Range("A1").End(xlDown)).Count 

你有没有尝试过 :-

 Sub test() k = Cells(Rows.Count, "A").End(xlUp).Row MsgBox (k) End Sub 

/唯一/ catch是如果没有数据,它仍然返回1。

这是很好的问题:)

当你有1个单元格(A1)的情况时,识别第二个被声明的单元格是不是空的是很重要的( sh.Range("A1").End(xlDown) )。 如果这是真的,这意味着你的范围失去控制:)看下面的代码:

 Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("Arkusz1") Dim k As Long If IsEmpty(sh.Range("A1").End(xlDown)) = True Then k = 1 Else k = sh.Range("A1", sh.Range("A1").End(xlDown)).Rows.Count End If 

这对我来说尤其如此,特别是在枢轴表格过滤中,当我想要过滤列上的数据单元的数量。 如果您有一个用于筛选的标题行,则相应地减lessk (k - 1)

 k = Sheets("Sheet1").Range("$A:$A").SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count