为什么我使用Worksheet.UsedRange.Rows.Count出错了结果

时间:2018-05-20 11:38:54

标签: excel vb.net vba excel-2013

在VB.NET中我想得到用过的行,所以我写了:

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

但是我不知道为什么lastRow的数字是而不是实际使用的行,我搜索了stackoverflow,有人建议像这样写:

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

我试过并且也没有用,num返回比实际使用的行少没有规则,所以我不知道如何处理它,任何想法都有帮助,非常感谢

编辑1最终答案是图像:

img1 在我搜索 this question 的答案的帮助下,它是对上次使用的行的全面理解并给出最终答案

编辑2做一个夏日

代码UsedRange.Rows.Count表示从包含数据的最后一行数据的第一行开始,这意味着您可以在第一个非空行到最后一个非空行之间有空行,这些行不会影响结果,但如果第一行为空,结果将是实际非空行的一个,如果前两行为空,结果将少两个,所以链接问题表示从不使用{{1}得到最后一行

4 个答案:

答案 0 :(得分:3)

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

<强>更新

要获取真实最后一列和一行,请使用以下代码:

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

更新2 img2

答案 1 :(得分:2)

有时只有出现太小。说我们有:

enter image description here

我们跑:

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

我们看到:

enter image description here

我们获取 3 而不是 4 的原因是工作表的第一行不在UsedRange

修改#1:

如果&#34; top&#34;需要包含工作表,然后使用:

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

答案 2 :(得分:1)

对于你所说的&#34;使用&#34;这是一个小小的平底船。行。如果工作表开头有任何空行,您将得到错误的最后一行编号,但您将获得使用的范围行数。

在第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

这使用了2来自UsedRange.Rows.Count,3来自使用xlCellTypeLastCell,数据如下:

Last row

答案 3 :(得分:0)

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

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

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

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

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

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

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