Можно ли упростить

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Позволю себе тоже подискутировать на эту тему. Безусловно, что подсчитывать количество используемых строк (UsedRange.Rows.Count) не подходит. Так, например, если используются строки с 5 по 8, то получим значение 4. Корректировать, т.е. проводить еще одну математическую операцию, нерационально.
Если речь идет об экономии того ничтожного времени, которое тратит Excel на подсчет количества строк, то для определения последней заполненной строки лучше вообще не использовать свойство Count. Если применить метод ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row, то будет чуть быстрее, за счет того, что Excel, где-то у себя в "недрах" хранит это значение и выдает его мгновенно. Правда, нужно заметить, что если, например, ввести данные в ячейку, расположенную "ниже" диапазона UsedRange, а затем очистить эту ячейку, то предлагаемый метод вернет номер строки этой ячейки. Но для определения, например, последней заполненной строки столбца "A", используя

Код: Выделить всё

Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, "A").End(xlUp).Row
ошибки не будет. Т.е. таким образом, мы не привязаны к общему количеству строк (2003 или 2007) и не тратим время на свойство Count.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

SAS888, Супер. Класс. Блеск. Вы, как всегда, - бесподобны!!!!
Большое спасибо за информацию.
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

Код: Выделить всё

Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, "A").End(xlUp).Row
вернёт номер строки ПЕРВОЙ а не последней заполненной в последней области
столбца А ячейки
Правильный код

Код: Выделить всё

Cells(Cells.SpecialCells(xlCellTypeLastCell).Row+1, "A").End(xlUp).Row
Rows.Count так же срабатывает мгновенно. Рекомендовал бы пользоваься им.
Андрей Энтелис,
aentelis.livejournal.com
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

ну вот... доверился на 100% мнению профессионалов.. а мнения разошлись...
прийдётся погонять тесты на скорость.
Спасибо.
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Aent. Да, конечно +1.
По поводу времени выполнения: оно ничтожно мало, и Rows.Count действительно выполняется быстрее. Странно, значит пересчитать все строки быстрее, чем выдать готовое значение. Где же он его хранит?
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

SAS888,
Где же он его хранит?
Как константу в классе, релизующем коллекцию Rows. Разумеется,никто строки не считает :)
Андрей Энтелис,
aentelis.livejournal.com
Ответить