У меня есть рабочий лист Excel с кнопкой.
Когда я вызываю функцию usedRange (), возвращаемый диапазон включает часть кнопки.
Есть ли в любом случае, я могу просто получить фактический используемый диапазон, который содержит данные?
Какая кнопка, ни управление формами, ни управление ActiveX не должны влиять на используемый диапазон.
Это известная проблема, что Excel не очень хорошо отслеживает используемый диапазон. Любая ссылка на используемый диапазон через VBA сбросит значение в текущий используемый диапазон. Поэтому попробуйте запустить эту подпроцедуру:
Sub ResetUsedRng()
Application.ActiveSheet.UsedRange
End Sub
В противном случае у вас может быть какое-то форматирование. Попробуйте очистить / удалить все ячейки после последнего ряда.
Относительно вышеизложенного также см .:
Еще один метод поиска последней использованной ячейки:
Dim rLastCell As Range
Set rLastCell = ActiveSheet.Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False)
Измените направление поиска, чтобы найти первую использованную ячейку.
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
не очень надежен).
Вот пара функций для возврата последней строки и 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
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
Я использую следующий код 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)
Эта функция дает все 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