Excel VBA- поиск последнего столбца с данными
Я нашел этот метод для поиска последних данных, содержащих строку в листе:
ws.Range("A65536").End(xlUp).row
Существует ли аналогичный метод для поиска последнего столбца с данными на листе?
Благодарю.
7 ответов
Много способов сделать это. Самый надежный - найти.
Dim rLastCell As Range
Set rLastCell = ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, MatchCase:=False)
MsgBox ("The last used column is: " & rLastCell.Column)
Если вы хотите найти последний столбец, использованный в определенной строке, вы можете использовать:
Dim lColumn As Long
lColumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column
Используя используемый диапазон (менее надежный):
Dim lColumn As Long
lColumn = ws.UsedRange.Columns.Count
Использование используемого диапазона не будет работать, если у вас нет данных в столбце А. Смотрите здесь еще одну проблему с используемым диапазоном:
Смотрите здесь относительно сброса используемого диапазона.
Я знаю, что это старо, но я проверял это многими способами, и это еще не подводило меня, если кто-то не может сказать мне иначе.
Номер строки
Row = ws.Cells.Find(What:="*", After:=[A1] , SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Колонка Письмо
ColumnLetter = Split(ws.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Cells.Address(1, 0), "$")(0)
Номер колонки
ColumnNumber = ws.Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Я думаю, что мы можем изменить UsedRange
код из ответа Reafidy выше, чтобы получить последний использованный столбец, даже если начальные столбцы пустые или нет.
Так это lColumn = ws.UsedRange.Columns.Count
модифицировано для
этот lColumn = ws.UsedRange.Column + ws.UsedRange.Columns.Count - 1
всегда даст надежные результаты
?Sheet1.UsedRange.Column + Sheet1.UsedRange.Columns.Count - 1
Выше линии урожайности 9
в ближайшем окне.
Попробуйте использовать код после активации листа:
Dim J as integer
J = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
Если вы используете Cells.SpecialCells(xlCellTypeLastCell).Row
только проблема будет в том, что xlCellTypeLastCell
информация не будет обновлена, если не выполнить действие "Сохранить файл". Но использовать UsedRange
всегда будет обновлять информацию в режиме реального времени.
Вот кое-что, что может быть полезно. Выбор всего столбца на основе строки, содержащей данные, в этом случае я использую 5-ую строку:
Dim lColumn As Long
lColumn = ActiveSheet.Cells(5, Columns.Count).End(xlToLeft).Column
MsgBox ("The last used column is: " & lColumn)
Вот простой вариант, если ваши данные начинаются в первой строке.
MsgBox "Last Row: " + CStr(Application.WorksheetFunction.CountA(ActiveSheet.Cells(1).EntireRow))
Он просто использует
CountA
для подсчета количества столбцов с данными во всей строке.
У этого есть всевозможные сценарии, в которых это не сработает, например, если у вас есть несколько таблиц, разделяющих верхнюю строку, но для нескольких быстрых и простых вещей это работает идеально.
Я давно использую метод / ответ @Reafidy , но сегодня я столкнулся с проблемой с объединенной ячейкой верхней строки из A1->N1 и моей функцией, возвращающей «Последний столбец» как 1, а не 14.
Вот моя измененная функция, теперь учитывающая, возможно, объединенные ячейки:
Public Function Get_lCol(WS As Worksheet) As Integer
Dim sEmpty As Boolean
On Error Resume Next
sEmpty = IsWorksheetEmpty(Worksheets(WS.Name))
If sEmpty = False Then
Get_lCol = WS.Cells.Find(What:="*", after:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
If IsMerged(Cells(1, Get_lCol)) = True Then
Get_lCol = Cells(1, Get_lCol).MergeArea.Columns.Count
End If
Else
Get_lCol = 1
End If
End Function
Public Function IsWorksheetEmpty(WS As Worksheet) As Boolean
On Error GoTo ErrorHandler
If WorksheetFunction.CountA(WS.UsedRange) = 0 And WS.Shapes.Count = 0 Then
IsWorksheetEmpty = True
GoTo EndFunc
Else
IsWorksheetEmpty = False
GoTo EndFunc
End If
ErrorHandler:
IsWorksheetEmpty = False
EndFunc:
End Function
Public Function IsMerged(rcell As Range) As Boolean
IsMerged = rcell.MergeCells
End Function