why i use Worksheet.UsedRange.Rows.Count got wrong result

前端 未结 4 1926
孤城傲影
孤城傲影 2020-12-06 09:00

In VB.NET I want to get the used rows so I wrote that:

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


        
相关标签:
4条回答
  • 2020-12-06 09:12

    Try to avoid UsedRange. It can be misleading. For instance, if you fill range A1:B5 and clear the contents of column B, then UsedRange.Columns.Count will return 2 - because Excel remembers cells with formatting and includes them into UsedRange.

    UPDATE

    To get real last column and row, use following code:

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

    UPDATE 2 img2

    0 讨论(0)
  • 2020-12-06 09:26

    This is a bit of a punt on what you mean by "used" rows. If you have any blank rows at the start of the sheet you will get the wrong last row number but you will get the used range row count.

    Try the following with row 1 blank.

    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
    

    This yields 2 from UsedRange.Rows.Count and 3 from using xlCellTypeLastCell with data as below:

    0 讨论(0)
  • 2020-12-06 09:31

    I'm using Excel 2013, and as far as I can see the UsedRange and UsedRange.Count Properties work correctly

    In previous versions I can remember noticing that they were unreliable, and I think this may be the reasons of some older posts, eg stackoverflow.com/questions/11169445...

    Note that the UsedRange is a Single Rectangular Area bounded by the Top-, Right-, Bottom-, and Left-most Non-Blank Cells, so that the Last Used Row is thus

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

    Note also that UsedRange INCLUDES all Cells that have Any Content, for example a Border, Interior Coloring or a Comment, not just those with a Value or a Formula

    Depending on what you are trying to achieve, using the SpecialCells and Find Methods may be preferable; for example the Last Used Row can also be found using

    ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
    
    0 讨论(0)
  • 2020-12-06 09:34

    Sometimes it only appears too small. Say we have:

    and we run:

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

    We see:

    The reason we get 3 rather than 4 is that the top row of the worksheet is not in UsedRange!

    EDIT#1:

    If the "top" of the worksheet needs to be included then use:

    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
    
    0 讨论(0)
提交回复
热议问题