it-swarm.cn

获得实际使用范围

我有一个带有按钮的Excel工作表。

当我调用usedRange()函数时,它返回的范围包括按钮部分。

无论如何我可以获得包含数据的实际使用范围吗?

17
thinkanotherone

什么样的按钮,表单控件和ActiveX控件都不应该影响使用的范围。

这是一个众所周知的问题,Excel无法很好地跟踪使用范围。通过VBA对使用范围的任何引用都会将值重置为当前使用的范围。所以尝试运行这个子程序:

Sub ResetUsedRng()
    Application.ActiveSheet.UsedRange 
End Sub 

如果没有你可能会有一些格式悬挂。尝试清除/删除最后一行之后的所有单元格。

关于以上也见:

Excel开发人员提示

找到最后一个使用过的单元格的另一种方法:

    Dim rLastCell As Range

    Set rLastCell = ActiveSheet.Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
    xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)

更改搜索方向以查找第一个使用过的单元格。

32
Reafidy

Readify做了一个非常完整的答案。但是,我想添加End语句,你可以使用:

在列中的空白之前找到上次使用的单元格:

Sub LastCellBeforeBlankInColumn()
Range("A1").End(xldown).Select
End Sub

找到列中最后使用的单元格:

Sub LastCellInColumn()
Range("A" & Rows.Count).End(xlup).Select
End Sub

在行中的空白之前找到最后一个单元格:

Sub LastCellBeforeBlankInRow()
Range("A1").End(xlToRight).Select
End Sub

找到行中最后一个使用过的单元格:

Sub LastCellInRow()
Range("IV1").End(xlToLeft).Select
End Sub

请参阅 此处 了解更多信息(以及为什么xlCellTypeLastCell不太可靠的解释)。

20
JMax

这里有一对函数来返回工作表的最后一行和col,基于Reafidy的解决方案。

    Function LastRow(ws As Object) As Long

        Dim rLastCell As Object
        On Error GoTo ErrHan
        Set rLastCell = ws.Cells.Find("*", ws.Cells(1, 1), , , xlByRows, _
                                      xlPrevious)
        LastRow = rLastCell.Row

    ErrExit:
        Exit Function

    ErrHan:
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
               vbExclamation, "LastRow()"
        Resume ErrExit

    End Function

    Function LastCol(ws As Object) As Long

        Dim rLastCell As Object
        On Error GoTo ErrHan
        Set rLastCell = ws.Cells.Find("*", ws.Cells(1, 1), , , xlByColumns, _
                                      xlPrevious)
        LastCol = rLastCell.Column

    ErrExit:
        Exit Function

    ErrHan:
        MsgBox "Error " & Err.Number & ": " & Err.Description, _
               vbExclamation, "LastRow()"
        Resume ErrExit

    End Function
5
davidlandy
Public Sub FindTrueUsedRange(RowLast As Long, ColLast As Long)
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    RowLast = 0
    ColLast = 0
    ActiveSheet.UsedRange.Select
    Cells(1, 1).Activate
    Selection.End(xlDown).Select
    Selection.End(xlDown).Select
    On Error GoTo -1: On Error GoTo Quit
    Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Activate
    On Error GoTo -1: On Error GoTo 0
    RowLast = Selection.Row
    Cells(1, 1).Activate
    Selection.End(xlToRight).Select
    Selection.End(xlToRight).Select
    Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Activate
    ColLast = Selection.Column
Quit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    On Error GoTo -1: On Error GoTo 0
End Sub
3
David F Mayer

我使用以下vba代码来确定工作表的整个使用行范围,然后缩短列的选定范围:

    Set rUsedRowRange = Selection.Worksheet.UsedRange.Columns( _
    Selection.Column - Selection.Worksheet.UsedRange.Column + 1)

反过来也是相反的:

    Set rUsedColumnRange = Selection.Worksheet.UsedRange.Rows( _
    Selection.Row - Selection.Worksheet.UsedRange.Row + 1)
0
swhgraham