У меня есть рабочий лист Excel с кнопкой.
Когда я вызываю функцию usedRange(), возвращаемый диапазон включает в себя часть кнопки.
В любом случае я могу просто получить фактический диапазон использования, содержащий данные?
У меня есть рабочий лист Excel с кнопкой.
Когда я вызываю функцию usedRange(), возвращаемый диапазон включает в себя часть кнопки.
В любом случае я могу просто получить фактический диапазон использования, содержащий данные?
Какая кнопка, ни управление формами, ни элемент управления ActiveX не должны влиять на используемый диапазон.
Известная проблема: excel не очень хорошо отслеживает используемый диапазон. Любая ссылка на используемый диапазон через VBA будет reset значением текущего диапазона. Поэтому попробуйте выполнить эту процедуру:
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
не очень надежно).
Здесь пара функций для возврата последней строки и столбца рабочего листа на основе решения 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 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