Страницы: 1
RSS
VBA. Определение LastRow с учетом скрытых столбцов и форматирования
 

Доброго времени суток, с прошедшими :) ноябрьскими праздниками!

Имеется xlsm файл.

Требуется найти последнюю заполненную строку видимым отображаемым значением (формул тут нет и не планируется, файл и так весит очень много в связи с форматированием 1006 строк).

На просторах интернета изучила материалы, задача-то простая, а вот решение не нашла для своего примера.

В примере 4 макроса, только один из них считает правильно с учетом скрытых столбцов – Primer1 (его я набросала сама). Но очень уж долго – больше 3-х секунд.

Возможно ли использовать какое-либо еще решение? Количество столбцов – постоянное – 664. Количество строк, максимально возможных заполненных – с 7-ой по 1006-ю. Строки отформатированы.

В диапазоне "A7:YN664" нет объединенных ячеек.

В данном примере пришлось убрать форматирование после 30-й строки и 34-столбца. А то файл весил почти 2 Мб.

Спасибо!
Изменено: Diana Tailor - 23.11.2018 18:00:29
 
Цитата
Diana Tailor написал: Требуется найти последнюю заполненную строку видимым отображаемым значением
Уточните, что Вы подразумеваете под фразой "видимым отображаемым значением"?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Имеется ввиду, что ячейка будет заполнена обычными данными, не будет пробелов, результатов формул типа a17="" и так далее.
Т.е. либо текст, либо цифры, либо видимые символы, либо все вперемешку.
 
Посмотрите это и другие сообщения Владимира (ZVI) в теме.
Изменено: sokol92 - 23.11.2018 18:18:38
Владимир
 
что-то мне подсказывает, что без перебора строк или столбцов с проверкой видимости и использования по ним Cells(Rows.Count, 1).End(xlUp).Row с выбором максимального не обойтись и это не должно быть безумно долго.
По вопросам из тем форума, личку не читаю.
 
sokol92, спасибо. Решение помогло от ZVI.
БМВ, выдает "15", что тоже неверно :)
 
одно толькго уточнение что ячейка типа a17="" - это пустая ячейка (визульно - да, но фактически - это свой индивидуальный алгортим)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Last row
Изменено: JayBhagavan - 24.11.2018 05:30:27 (исправил логическую ошибку в коде)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо
но в моем примере она показывает "15", а должна быть "28".

метод ZVI из поста sokol92 решил проблему.
Код
' Aux function: max value of arguments
Function Max(ParamArray Values())
  Dim x
  For Each x In Values
    If x > Max Then Max = x
  Next
End Function

' Последняя строка на листе Sh
' Если Sh не задан, то используется активный лист
' Если VisibleOnly=True, то результат только для видимых ячеек
Function LastRow(Optional Sh As Worksheet, Optional VisibleOnly As Boolean) As Long
  Dim SpecCells(), x, a$, i&, Rng As Range
  SpecCells = Array(xlCellTypeConstants, xlCellTypeFormulas, xlCellTypeComments)
  On Error Resume Next
  If Sh Is Nothing Then Set Sh = ActiveSheet
  Set Rng = Sh.UsedRange
  If VisibleOnly Then Set Rng = Rng.SpecialCells(xlCellTypeVisible)
  For Each x In SpecCells
    a = Rng.SpecialCells(x).EntireRow.Address(0, 0)
    i = Max(i, CLng(Mid(a, InStrRev(a, ":") + 1)))
  Next
  LastRow = i
End Function

Sub sub1()
MsgBox LastRow
End Sub
 
Diana Tailor, спасибо за замечание. Исправил.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
Страницы: 1
Наверх