Worksheet.UsedRange.Rows.Count returns 错误结果

Worksheet.UsedRange.Rows.Count returns wrong result

在 VB.NET 中,我想获取使用过的行,所以我这样写:

Dim objWorksheet As Excel.Worksheet = workbook.Sheets(2)
Dim lastRow = objWorksheet.UsedRange.Rows.Count

lastRow 的数量比使用的行数。我搜索了网站,有人建议:

Dim range As Excel.Range = objWorkSheet.UsedRange
Dim lastRow = range.Rows.Count

这 returns 比实际使用的行少。

解决方法如图:

发现this question是对上次使用的行的整体理解

UsedRange.Rows.Count表示从第一行有数据到最后一行有数据,这意味着你可以在第一个非空行到最后一个非空行之间有空行,这不影响结果,但是如果第一行是空的,结果会少一个实际的非空行,如果前两行是空的,结果会少两个,所以link问题说永远不要使用UsedRange.Rows.Count 获取最后一行。

这是对您所说的 "used" 行的意思的一点赌注。如果您在 sheet 的开头有任何空白行,您将获得错误的最后一行编号,但您将获得已使用的范围行数。

在第 1 行空白的情况下尝试以下操作。

Option Explicit

Sub test()
    Dim rng As Range
    Set rng = ActiveSheet.UsedRange
    Debug.Print rng.Rows.Count                   '2
    Debug.Print ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row '3

End Sub

这从 UsedRange.Rows.Count 产生 2 个,从使用 xlCellTypeLastCell 产生 3 个,数据如下:

有时只是显得太小了。假设我们有:

我们运行:

Sub aRowsByAnyOtherName1()
    Dim N As Long
    N = ActiveSheet.UsedRange.Rows.Count
    MsgBox N
End Sub

我们看到:

我们得到 3 而不是 4[= 的原因39=] 是工作表的第一行不在 UsedRange!

编辑#1:

如果需要包含工作表的 "top" 则使用:

Sub aRowsByAnyOtherName2()
    Dim N As Long, rng As Range
    Set rng = ActiveSheet.UsedRange
    N = rng.Rows.Count + rng(1).Row - 1
    MsgBox N
End Sub

尽量避免UsedRange。这可能会产生误导。例如,如果您填充范围 A1:B5 并清除列 B 的内容,则 UsedRange.Columns.Count 将 return 2 - 因为 Excel 记住格式为 的单元格并将它们包含在 UsedRange 中。

更新

要获得 real 最后一列和最后一行,请使用以下代码:

lRealLastRow = _
    Cells.Find("*", Range("A1"), xlFormulas, , xlByRows, xlPrevious).Row
lRealLastColumn = _
    Cells.Find("*", Range("A1"), xlFormulas, , xlByColumns, xlPrevious).Column

更新 2

我使用的是 Excel 2013,据我所知,UsedRange 和 UsedRange.Count 属性工作正常

在以前的版本中,我记得注意到它们不可靠,我认为这可能是一些较旧帖子的原因,例如 whosebug.com/questions/11169445...

请注意,UsedRange 是由最顶部、最右侧、最底部和最左侧界定的单个矩形区域 非空白单元格,因此最后使用的行是

ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1  

另请注意,UsedRange 包括具有任何内容的所有单元格,例如边框、内部着色或注释,而不仅仅是具有值或公式的单元格

根据您要实现的目标,使用 SpecialCells 和 Find 方法可能更可取;例如,最后使用的行也可以使用

找到
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row

UsedRange 完全按照这些场景中应该做的去做。你有多少行数据?如果你有一个工作中心的数据块sheet有3行4列,UsedRange returns 3行合适。例如,如果你的作品sheet在第1:3行中有空行,你必须有意识地注意这一点。 UsedRange 如果您正确地格式化您的工作簿,它会非常强大,如果它没有这样格式化,它甚至会更强大,因为它不关心 table 在哪里。

作为最佳做法,您应该始终在单元格 A1 开始的跨页sheet 上有一个连续的 table 数据。如果您需要一个包含几行和几列的摘要格式,那应该是一个单独的 sheet。如果您从其他来源获得的作品sheet 格式不正确,则您的工作是在分析它之前修复它——删除 table.[= 前面的空行和空列。 13=]