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
Другие вопросы по тегам