powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск последней ячейки в Excel
18 сообщений из 18, страница 1 из 1
Поиск последней ячейки в Excel
    #33690204
kminas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, пока самостоятельно не получается. Имеется таблица Columns A-E. Заполняю её макросами. После выполнения очередного макроса, необходимо находить последнюю непустую ячейку в этом диапазоне и ставить курсор в столбец "А" ниже нее на 2 строки. Константин
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690338
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую такой код для определения Range, содержащего данные (просто использовать UsedRange не катит из-за того, что в него попадают и пустые ячейки, для которых определен формат):
Код: 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.
Public Function RealUsedRange(UsedRange As Range) As Range

    Dim rng As Range
    Dim FirstCell As Range
    Dim iFirstColumn As Long
    Dim iFirstRow As Long
    Dim iColumns As Long
    Dim iRows As Long
    
    On Error GoTo HandleError
    
    Set RealUsedRange = UsedRange
    Set FirstCell = UsedRange.Cells( 1 ,  1 )
    
    iFirstColumn = FirstCell.Column
    iFirstRow = FirstCell.Row

    Set rng = UsedRange.Find("*", FirstCell, xlValues, xlPart, xlByRows, xlPrevious, False)
    iRows = rng.Row
    iRows = iRows - iFirstRow +  1 
    Set rng = UsedRange.Find("*", FirstCell, xlValues, xlPart, xlByColumns, xlPrevious, False)
    iColumns = rng.Column
    iColumns = iColumns - iFirstColumn +  1 
    Set RealUsedRange = FirstCell.Resize(iRows, iColumns)
'    Debug.Print RealUsedRange.Address

HandleExit:
    Exit Function
HandleError:
    Resume HandleExit
    Resume Next
End Function
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690492
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
    Dim i As Long
    i = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
почитай про метод "End" очень полезный
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690584
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor
Код: plaintext
1.
    Dim i As Long
    i = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
почитай про метод "End" очень полезный
Хороший способ, но в целом для Worksheet, а не для диапазона ячеек
(я понял речь идет о Range).
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690602
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон за банальность , а чем не катит стандартная ф-ция
activecell.SpecialCells(xlCellTypeLastCell).Address
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690633
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeпардон за банальность , а чем не катит стандартная ф-ция
activecell.SpecialCells(xlCellTypeLastCell).Address

этот метод использует "UsedRange" т.е. если была ячейка заполнена а потом очищена, то адрес будет этой ячейки
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690655
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маладец зачот
я еще несколько лет назад для себя написал вот так вот
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function LastUsedRow() As Long
Dim tmpR As Range       
Dim arRow( 256 ) As Long 
   For Each tmpR In [A65536:AA65536]
       arRow(tmpR.Column) = tmpR.End(xlUp).Row
   Next

   LastUsedRow = WorksheetFunction.Max(arRow)

End Function
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690678
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov vkodor
Код: plaintext
1.
    Dim i As Long
    i = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
почитай про метод "End" очень полезный
Хороший способ, но в целом для Worksheet, а не для диапазона ячеек
(я понял речь идет о Range).

можно организовать функцию и для диапозона
допустим так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Function RealUsedRange(myUsedRange As Range) As Range
    Dim i As Long, r As Long
    Dim c As Byte
    If myUsedRange.Rows.Count =  1  Then Exit Function
    For x =  1  To myUsedRange.Columns.Count
        If myUsedRange.Cells( 2 , x) <> "" And _
            i < myUsedRange.Cells( 1 , x).End(xlDown).Row Then _
            i = myUsedRange.Cells( 1 , x).End(xlDown).Row: c = x
    Next x
    Set RealUsedRange = myUsedRange.Cells( 1 ,  1 ).Resize(i, c)
End Function
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690693
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeмаладец зачот
я еще несколько лет назад для себя написал вот так вот
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function LastUsedRow() As Long
Dim tmpR As Range       
Dim arRow( 256 ) As Long 
   For Each tmpR In [A65536:AA65536]
       arRow(tmpR.Column) = tmpR.End(xlUp).Row
   Next

   LastUsedRow = WorksheetFunction.Max(arRow)

End Function

хитро
с удовольствием снимаю шляпу (если конечно сам придумал)
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690705
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkodor...можно организовать функцию и для диапозона
допустим так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Public Function RealUsedRange(myUsedRange As Range) As Range
    Dim i As Long, r As Long
    Dim c As Byte
    If myUsedRange.Rows.Count =  1  Then Exit Function
    For x =  1  To myUsedRange.Columns.Count
        If myUsedRange.Cells( 2 , x) <> "" And _
            i < myUsedRange.Cells( 1 , x).End(xlDown).Row Then _
            i = myUsedRange.Cells( 1 , x).End(xlDown).Row: c = x
    Next x
    Set RealUsedRange = myUsedRange.Cells( 1 ,  1 ).Resize(i, c)
End Function

А чем Set rng = UsedRange.Find("*", FirstCell, xlValues, xlPart, xlByRows, xlPrevious, False) хуже перебора ячеек?
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33690724
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю чем хуже
у меня пишет что rng = нафиг
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33692922
kminas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, буду пробовать. Константин
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33693231
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я, например, использую такую функцию, чтобы еще и последние скрытые строки учитывались
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function RealLastRowHide(WB As Worksheet) As Long
Dim UsR As Range, K As Long, I As Long, FreeC As Long
  RealLastRowHide =  1 
  Set UsR = WB.UsedRange
  FreeC = UsR.Column + UsR.Columns.Count
  If FreeC >  256  Then FreeC =  256 
On Error Resume Next
  For I = UsR.Row + UsR.Rows.Count -  1  To  1  Step - 1 
    K = WB.Rows(I).RowDifferences(comparison:=WB.Cells(I, FreeC)).Row
    If Err.Number =  0  Then
      RealLastRowHide = I: Exit Function
    Else
      Err.Clear
    End If
  Next I
End Function
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33693563
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому интересно

Я тут провел небольшой анализ

Взял
1-ю функцию "RealUsedRange" - Serge Gavrilov
2-ю функцию "LastUsedRow" - big-duke
3-ю функцию "RealUsedRange2" - vkodor
4-ю функцию "RealLastRowHide" - sergeyvg

заключил в цикл
For x = 1 To 10000
...
Next x

и посмотрел время

получилось следующее

при маленьком диапозоне Range("C3:D20")
1-я 2,640625 сек
2-я 2,5625 сек
3-я 0,859375 сек
4-я 0 сек
при большом диапозоне Range("C3:О65518")
1-я 2,75 сек
2-я 591,234375 сек
3-я 46,22265625 сек
4-я 0,03125 сек
при большом диапозоне Range("C3:О65518") и скрытых пустых ячейках Range("C55518:О65518") (информацию я очистил в этих ячейках)
1-я 2,69921875 сек
2-я 613,84375 сек
3-я 42,96484375 сек
4-я 24,703125 сек

у четвертой функци есть один недостаток,
если вся строка равна одному значению,
то неправильно определяется последняя строка
надо сказать что на практике такого не бывает
так что на мой взгляд самая эфективная функция №4 - sergeyvg

прилагаю файл в котором я тестировал
может у кого-нибудь еще какие-нибудь мысли возникнут.
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33693569
vkodor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот и файл.
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33693597
dbf97
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а через запись макроса получается вот так
Range("E2").CurrentRegion.Rows.Count
...
Рейтинг: 0 / 0
Поиск последней ячейки в Excel
    #33693602
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм...насчет быстродействия согласен. Но, во первых, 10 000 раз я никогда не использовал эту ф-цию, а если была необходимость в многократном использовании, то я оптимизировал код для минимизации кол-ва вызовов.
А так исследование интересное.
Думаю что если взять скажем 100 прогонов и диапазон до 2000 строк, то разница будет незначительна.

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поиск последней ячейки в Excel
    #35066727
@Nik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkodorпри большом диапозоне Range("C3:О65518")
1-я 2,75 сек
2-я 591,234375 сек
3-я 46,22265625 сек
4-я 0,03125 сек

Что-то вы сильно много знаков после запятой понаписывали... Мне кажется их гораздо меньше в реале...
Выполните этот код и посмотрите результаты:
For I = 1 To 1000
Cells(I, 1) = Timer
Next
В столце А:А точность поставьте 6 знаков после запятой.
Как видите, реальное значение только лишь у второго знака после запятой... ;-)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск последней ячейки в Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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