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

Код: plaintext
       LastRow = WorksheetFunction.CountIf(Range(Cells( 1 , x), Cells( 65536 , x)), "*?")

Но всё время есть опасность что в исходных данных будет где нибуть пустая ячейка (возможно просто ошибка) и последняя строчка посчитается неправильно. Да и вообще как найти последнюю строку или столбец диапазона с данными если если не знаешь будут ли там пустые ячейки встречаться или нет? Надеюсь у меня получилось объяснить.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34329272
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри этот топик
http://www.sql.ru/forum/actualthread.aspx?tid=385309
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34329611
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Function LastCell(ws As Worksheet) As Range
  Dim LastRow&, LastCol%


   'From Rodney Powell, Microsoft MVP
   '"The sample procedure below is a variation on a
   'technique I learned from fellow Excel MVP, Bob Umlas."
   '
   'http://www.exceldeveloper.com/geeks012.shtml


  On Error Resume Next
  With ws
  ' Find the last real row
    LastRow& = .Cells.Find(What:="*", _
      SearchDirection:=xlPrevious, _
      SearchOrder:=xlByRows).Row
  ' Find the last real column
    LastCol% = .Cells.Find(What:="*", _
      SearchDirection:=xlPrevious, _
      SearchOrder:=xlByColumns).Column
  End With


' Initialize a Range object variable
' for the last populated row.
  Set LastCell = ws.Cells(LastRow&, LastCol%)
   
End Function

Sub test1()
   
x = LastCell(Sheets("ÏÔ_Çàïàñû")).Address

   
   Debug.Print x

End Sub

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Sub test2()
    Dim rng As Range
        
    Set rng = Cells
    
    x = Intersect( _
      rng.Find("*", rng( 1 ), xlValues, xlWhole, xlByRows, _
        xlPrevious).EntireRow, _
      rng.Find("*", rng( 1 ), xlValues, xlWhole, xlByColumns, _
        xlPrevious).EntireColumn).Address
    
    Debug.Print x
    
End Sub
 


Извиняюсь за вопросы, но если можно то я задам, а отвечать или нет вам решать
1) Я понимаю что вышеописанные варианты оба почти одно и то же, но может есть какая-то разница, если есть, то подскажите
2)Что значит
Код: plaintext
Set rng = Cells
3)что такое
Код: plaintext
rng( 1 )
во втором примере
4) И самое главное - возможно ли не считать те ячейки которые содержат значения ошибки или "0" (это в том случае если на листе формулы протянуты дальше чем заканчивается диапазон данных)
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34329681
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь опять же, сасое главное забыл вышеописанные способы лучше чем приведённый далее?
Если да, то почему?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 Sub test3()
     
     Dim i As Long
    x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
           
    Debug.Print x
    
End Sub
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34329696
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) первый вариант может быть использован для разных листов, т.к. лист указан в аргументе. Более универсальный вариант и, отличие от второго, не требует доработки для использования. Второй вариант - только идея.

2) Set rng = Cells - в переменную rng помещается диапазон "все ячейки текущего листа".

3) rng(1) - ссылка на первую ячейку по порядку из тех, что представлены в этом объекте (нумерация идет сначала в первом ряде слева направо, потом во втором и т.д.)

4) можно, но нужно дорабатывать, легче всего будет для конкретного листа с данными
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34329701
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeggasadИзвиняюсь опять же, сасое главное забыл вышеописанные способы лучше чем приведённый далее?
Если да, то почему?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 Sub test3()
     
     Dim i As Long
    x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
           
    Debug.Print x
    
End Sub
читай сообщения топика, откуда взял
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330062
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro1) первый вариант может быть использован для разных листов, т.к. лист указан в аргументе. Более универсальный вариант и, отличие от второго, не требует доработки для использования. Второй вариант - только идея.

2) Set rng = Cells - в переменную rng помещается диапазон "все ячейки текущего листа".

3) rng(1) - ссылка на первую ячейку по порядку из тех, что представлены в этом объекте (нумерация идет сначала в первом ряде слева направо, потом во втором и т.д.)

4) можно, но нужно дорабатывать, легче всего будет для конкретного листа с данными

1) Не понятно какая доработка нужна 2-му способу?
4) А как доработать?

vbapro Deggasad
Извиняюсь опять же, сасое главное забыл вышеописанные способы лучше чем приведённый далее?
Если да, то почему?


Код: plaintext
1.
2.
3.
4.
5.
 Sub test3()
     
     Dim i As Long
    x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
           
    Debug.Print x

End Sub

читай сообщения топика, откуда взял

Читал, так и не понял если честно отличий там сказано, что это для листа целиком, так и 2 предыдущих примера вроде для листа целиком

З.Ы.: Если задаю неправильные вопросы, не ругайте, просто я лучше их задам и не получу ответа, чем не попытаюсь мпросить совсем, это не значит что я совсем сам не хочу думать, на 80% вопросов которые у меня возникают я отвечаю сам. Спасибо!
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330233
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeggasadИзвиняюсь опять же, сасое главное забыл вышеописанные способы лучше чем приведённый далее?
Если да, то почему?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 Sub test3()
     
     Dim i As Long
    x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
           
    Debug.Print x
    
End Sub


Здесь речь не может идти о "лучше - хуже" - данные коды выполняют разные функции:

- первые два кода (по сути одно и то же, только один - Function, а др. Sub) ищут последнюю ячейку по всему листу (во всех столбцах)

- вышеуказанный код ищет последнюю ячейку в одном конкретном столбце

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 Sub test3()
     
     Dim i As Long
    x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
           
    Debug.Print x
    
End Sub


Здесь речь не может идти о "лучше - хуже" - данные коды выполняют разные функции:

- первые два кода (по сути одно и то же, только один - Function, а др. Sub) ищут последнюю ячейку по всему листу (во всех столбцах)

- вышеуказанный код ищет последнюю ячейку в одном конкретном столбце



KL
[MVP - Microsoft Excel]

Насчёт этого понял. Спасибо

Открытый вопрос - Как не считать те ячейки которые содержат значения ошибки или "0" (это в том случае если на листе формулы протянуты дальше чем заканчивается диапазон данных)?
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330301
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad
1) Не понятно какая доработка нужна 2-му способу?
4) А как доработать?
1) например - перехват ошибок и др.
4) без конкретного примера трудно сказать

DeggasadЗ.Ы.: Если задаю неправильные вопросы, не ругайте, просто я лучше их задам и не получу ответа, чем не попытаюсь мпросить совсем, это не значит что я совсем сам не хочу думать, на 80% вопросов которые у меня возникают я отвечаю сам. Спасибо!
А что, кто-то тебя ругает? По-моему, vbapro очень корректно и на все отвечает :-)
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330436
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)
1) например - перехват ошибок и др.
4) без конкретного примера трудно сказать


Конкретный пример прилагаю

Попытался максимально приблизить к реальности и в модуль уже записал оба варианта
(и Function, и Sub) нахождения последней ячейки.

Необходимо посчитать последнюю ячейку, не считая помеченных жёлтым цветом. Исхожу из условия что изменить формулы не имею возможности.

За корректные ответы спасибо большое, я ведь эту корректность и не пытался поставить под сомнение! Просто боюсь показаться полным лентяем, так сказать больше оправдание для самого себя почему столько вопросов.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330507
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deggasad
Необходимо посчитать последнюю ячейку, не считая помеченных жёлтым цветом. Исхожу из условия что изменить формулы не имею возможности.

Обычно такой проблемы не стоит, т.к. на практике всегда есть уникальный столбец без формул по которому и определяют последнюю запись.
Код: plaintext
x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count, n).End(xlUp).Row
где n - номер солбца по которому необходимо определить последнюю запись
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330536
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor Deggasad
Необходимо посчитать последнюю ячейку, не считая помеченных жёлтым цветом. Исхожу из условия что изменить формулы не имею возможности.

Обычно такой проблемы не стоит, т.к. на практике всегда есть уникальный столбец без формул по которому и определяют последнюю запись.
Код: plaintext
x = ActiveWorkbook.ActiveSheet.Cells(Rows.Count, n).End(xlUp).Row
где n - номер солбца по которому необходимо определить последнюю запись

Я так сейчас и делаю (ну не совсем так, но теперь буду делать так)
Просто случай такой, что теоритически в любом столбце последняя строчка может быть пустой, хотя в другом будет какое-то значение, поэтому и хочу перестраховаться на будущее!
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330667
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно сделать комбинацию методик
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function LastRow(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
    
    If WS Is Nothing Then Set WS = ActiveSheet
    
    If KeyColumn =  0  Then
        LastRow = WS.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
    Else
        LastRow = WS.Cells(Rows.Count, KeyColumn).End(xlUp).Row
    End If
   
End Function
если нужно определить по колонке, что чаще всего и применяется, я согласен с vkodor , то указываешь колонку, не указываешь - то получаешь максимум. По аналогии с этой функцией можно сделать функцию и для определения последней колонки.

Далее по вопросам: проверку ячеек, что в них находится, лучше сделать в основном цикле. Т.е находишь физический конец данных с помощью универсальной функции LastRow, а в основной программе уже определяешь что там за данные: ошибки, #N/A или нули, и соотв. обрабатываешь
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330829
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro
Далее по вопросам: проверку ячеек, что в них находится, лучше сделать в основном цикле. Т.е находишь физический конец данных с помощью универсальной функции LastRow, а в основной программе уже определяешь что там за данные: ошибки, #N/A или нули, и соотв. обрабатываешь
Идею понял
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330885
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbapro
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function LastRow(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
    
    If WS Is Nothing Then Set WS = ActiveSheet
    
    If KeyColumn =  0  Then
        LastRow = WS.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
    Else
        LastRow = WS.Cells(Rows.Count, KeyColumn).End(xlUp).Row
    End If
   
End Function

ошибка: нужно WS.Rows.Count вместо Rows.Count
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function LastRow(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
    
    If WS Is Nothing Then Set WS = ActiveSheet
    
    If KeyColumn =  0  Then
        LastRow = WS.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
    Else
        LastRow = WS.Cells(WS.Rows.Count, KeyColumn).End(xlUp).Row
    End If
   
End Function
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34330923
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как мог так и написал, по крайней мере надеюсь идея понятна, если подскажите как функции рабочего листа не использовать буду благодарен, сейчас работает впринципе нормально.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Function LastRow(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
    
    If WS Is Nothing Then Set WS = ActiveSheet
    
    If KeyColumn =  0  Then
        LastRow = WS.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
         Do While z =  0 
           z = WorksheetFunction.CountIf(Range(Cells(LastRow,  1 ), Cells(LastRow,  256 )), "*?") + _
               WorksheetFunction.CountIf(Range(Cells(LastRow,  1 ), Cells(LastRow,  256 )), ">0")
   
             If z =  0  Then
              LastRow = LastRow -  1 
             End If
         Loop
    Else
        LastRow = WS.Cells(WS.Rows.Count, KeyColumn).End(xlUp).Row
    End If
   
End Function
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34331005
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для твоего частного случая, может быть, это совсем неплохой вариант. Ну тогда, хотя бы раздели функционально на две части, чтоб LastRow можно было использовать в других местах:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Public Function LastRow(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
    
    If WS Is Nothing Then Set WS = ActiveSheet
    
    If KeyColumn =  0  Then
        LastRow = WS.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
    Else
        LastRow = WS.Cells(WS.Rows.Count, KeyColumn).End(xlUp).Row
    End If
   
End Function

Public Function LastRow_MySuper(Optional KeyColumn& =  0 , Optional WS As Worksheet) As Long
Dim z As Long

    LastRow_MySuper = LastRow(KeyColumn, WS)

    If KeyColumn =  0  Then
        LastRow_MySuper = LastRow_MySuper +  1 
        
        Do
            LastRow_MySuper = LastRow_MySuper -  1 
            
            z = WorksheetFunction.CountIf(Range(Cells(LastRow_MySuper,  1 ), Cells(LastRow_MySuper,  256 )), "*?") + _
                WorksheetFunction.CountIf(Range(Cells(LastRow_MySuper,  1 ), Cells(LastRow_MySuper,  256 )), ">0")
    
        Loop While z =  0 
    End If
    
End Function
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34331134
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за участие
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34400954
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не вопрос, а факт.
т.к. сам участвовал в этом обсуждении и предлагал решения. решения оказались неверными, т.к. вот в таком файле не верно находится последняя колонка, если использовать алгоритм
Код: plaintext
1.
2.
3.
4.
? Intersect( _
      Cells.Find("*", Cells( 1 ), xlValues, xlWhole, xlByRows, _
        xlPrevious).EntireRow, _
      Cells.Find("*", Cells( 1 ), xlValues, xlWhole, xlByColumns, _
        xlPrevious).EntireColumn).Address
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34401615
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproне вопрос, а факт.
т.к. сам участвовал в этом обсуждении и предлагал решения. решения оказались неверными, т.к. вот в таком файле не верно находится последняя колонка, если использовать алгоритм
Код: plaintext
1.
2.
3.
4.
? Intersect( _
      Cells.Find("*", Cells( 1 ), xlValues, xlWhole, xlByRows, _
        xlPrevious).EntireRow, _
      Cells.Find("*", Cells( 1 ), xlValues, xlWhole, xlByColumns, _
        xlPrevious).EntireColumn).Address


Интересно, что данная ошибка возникает в Excel 2000-2007 и не возникает в Excel 97 :-) Я всегда говорил - слияние ячеек в Excel это едва ли не самая глючная фича :-(

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802214
vbapro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще факт. Возможно я последний, кто с ним встретился :), но пусть будет в топике.
Конструкция типа
Код: plaintext
LastRow = Sh.Cells(Sh.Rows.Count,  1 ).End(xlUp).Row
дает ложный результат, если на листе включен автофильтр.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802290
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproЕще факт. Возможно я последний, кто с ним встретился :), но пусть будет в топике.
Конструкция типа
Код: plaintext
LastRow = Sh.Cells(Sh.Rows.Count,  1 ).End(xlUp).Row
дает ложный результат, если на листе включен автофильтр.

А пример выложить можешь и указать версию Excel? А то у меня no repro :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802327
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй тоже поучаствую. Мой любимый find тупит наглухо с автофильтром.
В приложенном файле 2 листа. Если на первом косяк хоть как-то объясним (ищет последнюю видимую ячейку), то на втором листе вообще что-то непонятное, заметил, что это происходит когда все отфильтрованные значения находятся в начале списка и рядом друг с другом.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #34802328
Deggasad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbaproЕще факт. Возможно я последний, кто с ним встретился :), но пусть будет в топике.
Конструкция типа
Код: plaintext
LastRow = Sh.Cells(Sh.Rows.Count,  1 ).End(xlUp).Row
дает ложный результат, если на листе включен автофильтр.

У меня всегда находит последнюю видимую, вроде логика есть.
...
Рейтинг: 0 / 0
Номер последней строки или столбца
    #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
Номер последней строки или столбца
    #37169768
CoPBaHeu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
51 сообщений из 51, показаны все 3 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Номер последней строки или столбца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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