Получение фактического используемого диапазона - PullRequest
20 голосов
/ 15 сентября 2011

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

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

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

Ответы [ 6 ]

32 голосов
/ 15 сентября 2011

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

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

21 голосов
/ 15 сентября 2011

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

5 голосов
/ 12 июля 2012

Вот пара функций, которые возвращают последнюю строку и столбец таблицы на основе приведенного выше решения 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
3 голосов
/ 07 марта 2012
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 голосов
/ 20 июня 2019

Эта функция дает все 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 голосов
/ 04 декабря 2015

Я использую следующий код 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...