Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск последней ячейки в Excel / 18 сообщений из 18, страница 1 из 1
25.04.2006, 22:27
    #33690204
kminas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
К сожалению, пока самостоятельно не получается. Имеется таблица Columns A-E. Заполняю её макросами. После выполнения очередного макроса, необходимо находить последнюю непустую ячейку в этом диапазоне и ставить курсор в столбец "А" ниже нее на 2 строки. Константин
...
Рейтинг: 0 / 0
26.04.2006, 03:11
    #33690338
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
Я использую такой код для определения 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
26.04.2006, 09:06
    #33690492
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
Код: plaintext
1.
    Dim i As Long
    i = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
почитай про метод "End" очень полезный
...
Рейтинг: 0 / 0
26.04.2006, 09:44
    #33690584
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
vkodor
Код: plaintext
1.
    Dim i As Long
    i = ActiveWorkbook.ActiveSheet.Cells(Rows.Count,  1 ).End(xlUp).Row
почитай про метод "End" очень полезный
Хороший способ, но в целом для Worksheet, а не для диапазона ячеек
(я понял речь идет о Range).
...
Рейтинг: 0 / 0
26.04.2006, 09:49
    #33690602
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
пардон за банальность , а чем не катит стандартная ф-ция
activecell.SpecialCells(xlCellTypeLastCell).Address
...
Рейтинг: 0 / 0
26.04.2006, 09:58
    #33690633
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
big-dukeпардон за банальность , а чем не катит стандартная ф-ция
activecell.SpecialCells(xlCellTypeLastCell).Address

этот метод использует "UsedRange" т.е. если была ячейка заполнена а потом очищена, то адрес будет этой ячейки
...
Рейтинг: 0 / 0
26.04.2006, 10:04
    #33690655
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
маладец зачот
я еще несколько лет назад для себя написал вот так вот
Код: 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
26.04.2006, 10:16
    #33690678
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
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
26.04.2006, 10:21
    #33690693
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
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
26.04.2006, 10:23
    #33690705
Serge Gavrilov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
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
26.04.2006, 10:28
    #33690724
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
не знаю чем хуже
у меня пишет что rng = нафиг
...
Рейтинг: 0 / 0
26.04.2006, 20:41
    #33692922
kminas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
Спасибо всем, буду пробовать. Константин
...
Рейтинг: 0 / 0
27.04.2006, 08:12
    #33693231
sergeyvg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
я, например, использую такую функцию, чтобы еще и последние скрытые строки учитывались
Код: 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
27.04.2006, 10:40
    #33693563
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
Кому интересно

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

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

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
16.01.2008, 20:11
    #35066727
@Nik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск последней ячейки в Excel
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Поиск последней ячейки в Excel / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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