почему макрос нормально отрабативает если его записать в рабочую книгу, а если запускать макрос с PERSONAL.xlsb, то ошибка Subscript out of range (Error 9)
Скрыть строку при равенстве значений в двух столбцах
08.09.2015 09:48:07
|
|
|
|
08.09.2015 10:04:33
sergey2303,на сколько я понимаю, при способе:
Может лучше ...Sheets("Лист1") ? Кстати, Выше об этом уже было написано.
Изменено: |
|||
|
|
08.09.2015 10:33:55
Зачем вообще это всё? И скажете наконец сколько всего строк? |
|||
|
|
08.09.2015 10:41:18
В PERSONAL.xlsb нет листов к которым обращается процедура при обработке данных. Если хотите в PERSONAL.xlsb разместить процедуру нужно изменить обращение на With ActiveWorkbook - что означает работаем с активной книгой. А также побеспокоиться о том как указать процедуре активную книгу с которой нужно работать. |
|||
|
|
08.09.2015 10:51:33
|
|
|
|
08.09.2015 11:06:59
Значит в моей процедуре нужно изменить строку
В вашем случае, если правильно понял замените часть кода на
Изменено: |
|||||
|
|
08.09.2015 11:21:33
|
|
|
|
08.09.2015 11:29:36
sergey2303, не нужны пустые строки между обращением (копированным из сообщения именем) и текстом.
|
|
|
|
08.09.2015 12:31:43
запустил на рабочем файле. процес идет минут 5 а можете переделать скрипт на основе надстройки Plex. Там есть функция сравнить и закрасить совпавшие. у меня отрабативает ета функция до минути |
|
|
|
08.09.2015 13:32:46
Какой объем данных у вас в файле мне неизвестно. На тестах моя процедура обработала 10000 строк за 2 секунды (на моем слабом рабочем компе). У вас спрашивали сколько строк нужно обработать ?. Возможно нужно изменить алгоритм на работу с массивами. А в целом подход к решению Вашей общей задачи нужно изменить. Я писал алгоритм на основе того, что видел в файле примере. И из переписки понял, что данная задача только часть более крупного проекта. |
|||
|
|
08.09.2015 13:39:34
Как видно вся работа проделана впустую... Я не о себе - я пока нет ясности по задаче к решению не приступаю. А ясности так и нет, все вопросы без ответа... И уже и времени решать нет.
|
|
|
|
08.09.2015 13:44:01
|
|
|
|
08.09.2015 13:51:42
Но согласно слов
Изменено: |
|||
|
|
08.09.2015 14:27:59
робочий файл состоит: Лист 380* -- 103 000 строк, Лист1-- 2 500 строк в колонке F Листа 380* --- города, в колонке А Листа1 города которие нужно скрить на листе 380* |
|
|
|
08.09.2015 15:09:45
Для oSD - словаря 2500 строк загруженных через массив, вообще ерунда, задержки не может быть. Анализ совпадений ведется циклом по ренж и словарю, скорость выполнения достаточно быстрая, уступает лишь массиву со словарем и/или SQL. Только что потестил 65530 строк из которых скрылось около 65000, процедура выполнилась за 12 секунд, ваши 103000 строк должно отработать примерно 20 с (если конечно комп не Pentium 3 ). Возможно в вашем коде участвуют дополнительные процедуры ? |
|||
|
|
08.09.2015 15:30:48
|
|
|
|
08.09.2015 15:45:35
И большого количества формул нет в файле ?
Тогда непонятно выполнение процедуры на вашем файле за 5 минут. |
|
|
|
08.09.2015 15:47:33
нету формул
|
|
|
|
08.09.2015 15:48:58
а можно Ваш емейл, я сброшу файл |
|
|
|
08.09.2015 16:09:39
Скинул e-mail в личку. Смогу посмотреть вечером дома после работы.
Изменено: |
|
|
|
08.09.2015 18:57:34
Странная ситуация происходит. Если активна ячейка листа 380* скажем А1 или F1 (первая строка листа) то выполнение процедуры Sub HiddenRow1 () происходит на моем компе 304 секунды. Но если активная ячейка скажем А1048576 (последняя строка листа) или F103476 (в конце таблицы с данными) то выполнение процедуры происходит за 12 секунд. Задача выполняется одинаково, скрываются практически все строки. Не могу понять в чём зависимость. Конечно в код можно добавить такую конструкцию, что автоматом будет переводить лист к последней строке и выполняется тогда всё быстро, но это слишком топорно.
Может ГУРУ форума подскажут почему так происходит ? P.S Если активный "Лист1" выполняется еще быстрей (за 8 секунд)
Изменено: |
|||
|
|
08.09.2015 19:55:45
Так и не понял в чем причина вышеизложенного глюка.
Но с учётом увиденного предлагаю откоректированный код (с учетом особенностей Вашего
Альтернативный вариант решения задачи. Предлагаю новую процедуру. Процедура основана на массивах, работает в разы быстрее, но имеет одну особенность описанную в комментариях.
P.S. На работе проверил файл из поста №44 (primer (test)) - глюков описанных постом выше не наблюдается.
Изменено: |
|||||||||
|
|
09.09.2015 14:21:43
Первий вориант(
Sub HiddenRow1()) работает отлично Альтернативный вариант(HiddenRowArr) ошибка Run-time error 1004 на робочем файле. макрос помещен PERSONAL.xlsb |
|
|
|
09.09.2015 17:05:54
Измените строку кода в Sub HiddenRowArr()
Если честно так и не понял зачем Вам это нужно.
Изменено: |
|||||||
|
|
09.09.2015 17:31:13
Если честно так и не понял зачем Вам это нужно. отработав макрос показивает строки в которих не допустима пустая ячейка в колонке E, которие потом нужно заполнить в базе (скриваются те строки в которих допустимо пустое значение колонки E) |
|
|
|
09.09.2015 18:56:10
Не мне дает покоя Run-time error 1004. При изучении ошибки на вашем рабочем файле выяснил, что ошибка возникает, когда переменная sRows содержит более 256 символов. Возможно это связано с ограничением самой книги Ексель. Поэтому и обход решил выполнить ограничивая запись до 246 символов, т.к. в переменной sRows содержатся индексы строк. В Ексель 2010 максимальная строка 1048576 - 7 символов и 3 запасные оставил.
Изменил часть кода в Sub HiddenRowArr(), а именно эту часть
Протестировал Ваш рабочий файл на 1044829 записей, выполнилось без Run-time error 1004, за 15 секунд. Измените код у себя на рабочем файле, думаю будет веселей работать. Есть еще одна мысль, как будет время проверю ее и при успешном выполнении кода выложу. |
|||||||||
|
|
09.09.2015 19:31:31
TSN, про длину строки я уже говорил тут:
Правда не сказал сколько можно... Но мы уже это на форуме когда-то обсуждали в теме про удаление строк. ZVI удаление делал так - собирал массив меток, выгружал его рядом, сотировал по меткам, удалял сразу весь блок (сперва считал сколько нужно удалять). Для скрытия это не вполне подходит, но если порядок строк не важен - то можно и так делать. А если например важно просто узнать номера строк, чтоб потом править в базе - то зачем вообще всё это скрытие и всё остальное? Собрали номера в коллекцию, выгрузили куда-нибудь. А если этот файл и есть база - тогда можно и сортировать, а скрывать и не обязательно. |
|
|
|
09.09.2015 20:28:49
Ну и напоследок дабы закрепить практику по скрытию большого количества строк в файле, выложу последний вариант процедуры Sub HiddenRowArr() с доработанным алгоритмом. Файл на 1 044 829 записей, выполнилось без Run-time error 1004, за 4,2 секунды.
Изменено: |
|||||
|
|
||||