powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Номер последней строки или столбца
25 сообщений из 51, страница 2 из 3
Номер последней строки или столбца
    #34802394
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeggasadПожалуй тоже поучаствую. Мой любимый find тупит наглухо с автофильтром.
В приложенном файле 2 листа. Если на первом косяк хоть как-то объясним (ищет последнюю видимую ячейку), то на втором листе вообще что-то непонятное, заметил, что это происходит когда все отфильтрованные значения находятся в начале списка и рядом друг с другом.

Сутра перечитал. подумал а вдруг у вас не будет ошибки и решил поянить как онп выглядит у меня. У меня на листе В2 при данном фильтре последняя ячейка определяется определяется как D1 , т.е. смотрит только первую строку.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802483
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй запустить этот макрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub TestLastRow()
Dim RowIndex As Long

    Columns( 1 ).Clear

    For RowIndex =  1  To  20 
        Cells(RowIndex,  1 ).Value = (RowIndex Mod  3 ) +  1 
    Next RowIndex

    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
     
    Range("A1").AutoFilter
    Range("A1").AutoFilter Field:= 1 , Criteria1:="2"
    
    With Range("A50").End(xlUp)
        .Select
        .Interior.ColorIndex =  6 
    End With
    
    Range("A1").AutoFilter Field:= 1 
End Sub
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802514
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, версия Excel 2003 SP2
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802540
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Deggasad да, результат не тот, который ожидался, но дело скорее всего в алгоритме поиска, например
Код: plaintext
Cells.Find("*", , , , xlByColumns, xlPrevious).Address
покажет другое. Хотя, если при xlByRows изменить условие автофильтра (не "1"), то и найдет совсем по другой логике... Это уже непредсказуемо..

Опять же, в том примере, который я привел, конечно, есть лигика и, скорее всего, именно так и должно работать, ведь это метод реализующий Ctrl+Up, и пользователь должен попасть именно на последнюю видимую ячейку области. Просто при программировании этот метод не всегда подойдет для определения последней заполненной ячейки - скрытые не будут учтены.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802609
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже когда я не знал про этот глюк, я всё равно открывая програмно книги, на листах которых стоит автофильтр всегда на всякий случай сбрасывал его. Мне лично никогда не нужно было в коде обращаться к отфильтрованному диапазону, но недавно помогал кому-то на форуме и там было такое условие, что использовать отфильтрованный диапазон. В данном случае использовал этот пример для нахождения последней видимой строки
Код: plaintext
LastRow = Sh.Cells(Sh.Rows.Count,  1 ).End(xlUp).Row
И вроде я и не сомневался что так и должно быть, т.е. результат именно такой и ожидал, ведь как вы уже заметили
vbapro ...ведь это метод реализующий Ctrl+Up...
А если нужна именно последняя строка - нужно фильтр сбрасывать, есть конечно определённое неудобство...
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803549
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что сказать? К сожалению у меня repro если задано условие в последнем столбце. Спасибо тебе vbapro, доконал последний, казавшийся более менее надежным, способ поиска последней ячейки :Ь
Но впрочем я уже где-то писал, что абсолютного способа повидимому нет (или он еще не открыт)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803568
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Ну что сказать? К сожалению у меня repro если задано условие в последнем столбце. Спасибо тебе vbapro, доконал последний, казавшийся более менее надежным, способ поиска последней ячейки :Ь
Но впрочем я уже где-то писал, что абсолютного способа повидимому нет (или он еще не открыт)

KL
[MVP - Microsoft Excel]Пожалуйста :), буду рад, если это поможет коллегам не наступать на эти грабли. К счастью, сам с этим столкнулся при тестировании - данные оказались очевидно неполными.
В качестве компенсации привожу простой код, которым сам давно пользовался и на форуме эту идею видел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function LastRow(Optional TheCol =  0 , Optional Wsh As Worksheet) As Long
' находит последний ряд используемого диапазона
' если указано значение TheCol то находтся последний ряд с непустой ячейкой в колонике TheCol
' если в колонке или на листе нет значений возвращает 1

    If Wsh Is Nothing Then Set Wsh = ActiveSheet

    With Wsh
        LastRow = .UsedRange.Row + .UsedRange.Rows.Count
    
        If Not TheCol =  0  Then
            Do While .Cells(LastRow, TheCol).FormulaR1C1 = "" And LastRow >  1 
                LastRow = LastRow -  1 
            Loop
        End If
    End With
    
End Function
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803595
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что такое repro ?
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803637
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no repro значит, что явление не получается воссоздать или повторить, repro - соответсвенно, получается :)
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803648
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803657
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro KL (XL)Ну что сказать? К сожалению у меня repro если задано условие в последнем столбце. Спасибо тебе vbapro, доконал последний, казавшийся более менее надежным, способ поиска последней ячейки :Ь
Но впрочем я уже где-то писал, что абсолютного способа повидимому нет (или он еще не открыт)

KL
[MVP - Microsoft Excel]Пожалуйста :), буду рад, если это поможет коллегам не наступать на эти грабли. К счастью, сам с этим столкнулся при тестировании - данные оказались очевидно неполными.
В качестве компенсации привожу простой код, которым сам давно пользовался и на форуме эту идею видел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function LastRow(Optional TheCol =  0 , Optional Wsh As Worksheet) As Long
' находит последний ряд используемого диапазона
' если указано значение TheCol то находтся последний ряд с непустой ячейкой в колонике TheCol
' если в колонке или на листе нет значений возвращает 1

    If Wsh Is Nothing Then Set Wsh = ActiveSheet

    With Wsh
        LastRow = .UsedRange.Row + .UsedRange.Rows.Count
    
        If Not TheCol =  0  Then
            Do While .Cells(LastRow, TheCol).FormulaR1C1 = "" And LastRow >  1 
                LastRow = LastRow -  1 
            Loop
        End If
    End With
    
End Function


Ну во-первых, эта функция слегка привирает, а потом, она также находит и пустые ячейки с форматом отличным от стандартного. С таким же и даже лучшим результатом можно использовать:

Код: plaintext
1.
2.
3.
4.
Public Function LastRow(Optional Wsh As Worksheet) As Long
    If Wsh Is Nothing Then Set Wsh = ActiveSheet
    Set x = Wsh.UsedRange 'Reset the used range just in case
    LastRow = Wsh.Cells.SpecialCells(xlCellTypeLastCell).Row
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803663
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Ну во-первых, эта функция слегка привирает, а потом, она также находит и пустые ячейки с форматом отличным от стандартного. С таким же и даже лучшим результатом можно использовать:

Код: plaintext
1.
2.
3.
4.
Public Function LastRow(Optional Wsh As Worksheet) As Long
    If Wsh Is Nothing Then Set Wsh = ActiveSheet
    Set x = Wsh.UsedRange 'Reset the used range just in case
    LastRow = Wsh.Cells.SpecialCells(xlCellTypeLastCell).Row
End Function

Это если использовать функцию vbapro на весь лист (без первого параметра), а если для специфического столбца (с первым параметром), то гораздо эффективнее:

Код: plaintext
1.
2.
3.
Public Function LastRow(TheCol As Long, Optional Wsh As Worksheet) As Long
    If Wsh Is Nothing Then Set Wsh = ActiveSheet
    LastRow = Wsh.Cells(Wsh.Rows.Count, TheCol).End(xlUp).Row
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803666
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Ну во-первых, эта функция слегка привирает, а потом, она также находит и пустые ячейки с форматом отличным от стандартного. С таким же и даже лучшим результатом можно использовать:

Код: plaintext
1.
2.
3.
4.
Public Function LastRow(Optional Wsh As Worksheet) As Long
    If Wsh Is Nothing Then Set Wsh = ActiveSheet
    Set x = Wsh.UsedRange 'Reset the used range just in case
    LastRow = Wsh.Cells.SpecialCells(xlCellTypeLastCell).Row
End Function

KL
[MVP - Microsoft Excel]Не понял в чем привирает? В том, что дает не последний заполненный ряд, а первый пустой, наверное :). А на счет пустых ячеек с форматом, ...здесь я согласен с твоим высказыванием, что абсолютного способа повидимому нет. Инструмент должен соответсвовать задаче. Эта функция прекрасно подойдет для поиска конца конкретной колонки в таблице.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803680
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproНе понял в чем привирает? В том, что дает не последний заполненный ряд, а первый пустой, наверное :)
Ну да! Ты ж ее назвал-то LastRow


vbaproЭта функция прекрасно подойдет для поиска конца конкретной колонки в таблице.
Ну я-то как раз считаю, что, для поиска конца конкретной колонки в таблице, End(xlUp) значительно лучше чем Do While... - короче в написании и быстрее в пересчете

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803826
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Ну я-то как раз считаю, что, для поиска конца конкретной колонки в таблице, End(xlUp) значительно лучше чем Do While... - короче в написании и быстрее в пересчете

KL
[MVP - Microsoft Excel]...с учетом поста, с которого начался этот заход, что скрытые, в том числе фильтром, ячейки со значениями будут пропущены методом End(xlUp) и результатом будет не последяя заполненная, а последняя заполненная и нескрытая ячейка.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803893
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro...с учетом поста, с которого начался этот заход, что скрытые, в том числе фильтром, ячейки со значениями будут пропущены методом End(xlUp) и результатом будет не последяя заполненная, а последняя заполненная и нескрытая ячейка.

Упс, это я как-то упустил из виду :-)
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34803932
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помойму Вы просто подзабыли что END не учитывает скрытые стороки
Во втором посте этой темы есть ссылка через которую можно найти это
Поиск последней ячейки в Excel
Функция от sergeyvg
Код: plaintext
\nFunction RealLastRowHide(WB As Worksheet) As Long\nDim UsR As Range, K As Long, I As Long, FreeC As Long\n  RealLastRowHide =  1 \n  Set UsR = WB.UsedRange\n  FreeC = UsR.Column + UsR.Columns.Count\n  If FreeC >  256  Then FreeC =  256 \nOn Error Resume Next\n  For I = UsR.Row + UsR.Rows.Count -  1  To  1  Step - 1 \n    K = WB.Rows(I).RowDifferences(comparison:=WB.Cells(I, FreeC)).Row\n    If Err.Number =  0  Then\n      RealLastRowHide = I: Exit Function\n    Else\n      Err.Clear\n    End If\n  Next I\nEnd Function
Которая учитывает скрытые строки.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34804194
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodorПомойму Вы просто подзабыли что END не учитывает скрытые стороки
Во втором посте этой темы есть ссылка через которую можно найти это
Поиск последней ячейки в Excel
Функция от sergeyvg
Код: plaintext
\nFunction RealLastRowHide(WB As Worksheet) As Long\nDim UsR As Range, K As Long, I As Long, FreeC As Long\n  RealLastRowHide =  1 \n  Set UsR = WB.UsedRange\n  FreeC = UsR.Column + UsR.Columns.Count\n  If FreeC >  256  Then FreeC =  256 \nOn Error Resume Next\n  For I = UsR.Row + UsR.Rows.Count -  1  To  1  Step - 1 \n    K = WB.Rows(I).RowDifferences(comparison:=WB.Cells(I, FreeC)).Row\n    If Err.Number =  0  Then\n      RealLastRowHide = I: Exit Function\n    Else\n      Err.Clear\n    End If\n  Next I\nEnd Function
Которая учитывает скрытые строки.

Буквально 200-300 пустых строк в конце UsedRange дают серьёзную задержку, а запихнув это в цикл можно и подвесить комп.

Если по этому пути идти, то лучше уж так
Код: plaintext
Function RealLastRow(WB As Worksheet) As Long\nDim UsR As Range, K As Long, I As Long, FreeC As Long\n  RealLastRow =  1 \n  Set UsR = WB.UsedRange\n  \n  For I = UsR.Row + UsR.Rows.Count -  1  To  1  Step - 1 \n    K = WorksheetFunction.CountIf(UsR.Rows(I), "*?") + _\n        WorksheetFunction.CountIf(UsR.Rows(I), ">0")\n    If K >  0  Then RealLastRow = I: Exit Function\n  Next I\nEnd Function
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34804468
nPUBET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deggasad, 15.09, 14:46 .....
Код: plaintext
LastRow = Sh.Cells(Sh.Rows.Count,  1 ).End(xlUp).Row
И вроде я и не сомневался что так и должно быть, т.е. результат именно такой и ожидал, ведь как вы уже заметили
vbapro ...ведь это метод реализующий Ctrl+Up...
А если нужна именно последняя строка - нужно фильтр сбрасывать, есть конечно определённое неудобство...

может так подойдёт:

Код: plaintext
1.
2.
3.
4.
5.
6.
Sub PosledYachejkaDiapazona()

Sheets("List1").Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate
MsgBox "Последняя ячейка диапазона: " & ActiveCell.Address

End Sub
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34804734
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nPUBET
может так подойдёт:
Код: plaintext
1.
2.
3.
4.
Sub PosledYachejkaDiapazona()
Sheets("List1").Activate
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Activate
MsgBox "Последняя ячейка диапазона: " & ActiveCell.Address
End Sub


Это один из вариантов, минусы и плюсы которого обсуждались неоднократно на этом форуме, могёте почитать.

Сейчас нет конкретной задачи, мы просто обсуждаем недостатки различных способов нахождения последней строки.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Номер последней строки или столбца
    #37167106
CoPBaHeu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток

Позвольте прослыть некропостером и поставить конкретную задачу, а то от чтения сего топика только ещё больше запутался.

Итак:
Есть таблица с поставленным фильтром. После обновления данных макрос подставляет в фильтр нужные условия. После этого необходимо скопировать отфильтрованные данные в другую таблицу. И если фильтр не выбрал ни одного значения, копирование вываливается с ошибкой.

Как проверить, отфильтровано ли хоть одно значение? Так как фильтр стоит во второй строке, то задача сводится к выяснению, является ли вторая строка последней видимой на листе? Чем из выше приведённого лучше воспользоваться?

Заранее спасибо.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #37167145
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sub test()
Debug.Print Intersect(ActiveSheet.UsedRange, Rows("2:" & Rows.Count)).SpecialCells(xlCellTypeVisible).EntireRow.Rows.Count
End Sub
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #37167169
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, поторопился - так неправильно. Но в этом направлении можно идти...
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #37167189
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так здесь как раз подойдет это:
Код: plaintext
1.
Dim lLastRow as long
lLastRow = Cells(Rows.count, 1 ).end(xlup).row
Если lLastRow равно строке с заголовком таблицы(той строке, в которой установлен Автофильтр) - значит ни одного значения по фильтру не выведено.
Код: plaintext
1.
2.
3.
'rRng - диапазон с фильтром
If lLastRow = rRng.row then
msgbox "Нет значений для копирования"
End if
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #37167210
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так вроде ОК
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Explicit

Sub test()
Dim i As Long, rr As Range
For Each rr In Intersect(ActiveSheet.UsedRange, Rows("2:" & Rows.Count)).SpecialCells(xlCellTypeVisible).EntireRow.Rows
i = i +  1 
Next
Debug.Print i
End Sub
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Номер последней строки или столбца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]