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=]
在 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=]