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

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

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

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

Ответ 1

Какая кнопка, ни управление формами, ни элемент управления ActiveX не должны влиять на используемый диапазон.

Известная проблема: excel не очень хорошо отслеживает используемый диапазон. Любая ссылка на используемый диапазон через VBA будет reset значением текущего диапазона. Поэтому попробуйте выполнить эту процедуру:

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

Ответ 3

Здесь пара функций для возврата последней строки и столбца рабочего листа на основе решения 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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

    ' Display the range 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