Получение фактического диапазона использования

У меня есть рабочий лист Excel с кнопкой.

Когда я вызываю функцию usedRange (), возвращаемый диапазон включает часть кнопки.

Есть ли в любом случае, я могу просто получить фактический используемый диапазон, который содержит данные?

Решение

Какая кнопка, ни управление формами, ни управление 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)

Измените направление поиска, чтобы найти первую использованную ячейку.

Комментарии (2)

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 не очень надежен).

Комментарии (2)

Вот пара функций для возврата последней строки и 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
Комментарии (0)
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
Комментарии (0)

Я использую следующий код 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)

Эта функция дает все 4 предела используемого диапазона:

Function FindUsedRangeLimits()
    Set Sheet = ActiveSheet
    Sheet.UsedRange.Select

    ' Display the range's rows and columns.
    row_min = Sheet.UsedRange.Row
    row_max = row_min + Sheet.UsedRange.Rows.Count - 1
    col_min = Sheet.UsedRange.Column
    col_max = col_min + Sheet.UsedRange.Columns.Count - 1

    MsgBox "Rows " & row_min & " - " & row_max & vbCrLf & _
           "Columns: " & col_min & " - " & col_max
    LastCellBeforeBlankInColumn = True
End Function
Комментарии (0)