|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.02.2009, 23:51 | #1 |
Пользователь
Регистрация: 26.02.2009
Сообщений: 58
|
Что нужно оптимизировать?
Работа у меня бумажная и довольно однообразная. Выпоскаем грузовае документы после погрузки нефтяных танкеров.
Для оптимизации работы с данными по танкеру и удобства печати документов разработал програмку на основе Excel. Коллеги довольны, а я нет. Не оптимально, каряво.... Не смотря на то, что коллеги уговариваю угомонится решил сделать более интересную версию программы. В принципе в новой программе принципиально по-новому работает только главный лист, на котором консолидируются все данные, касаемые оформляемого танкера. Для сравнения прилагаю програмку на которой сейчас работаем BF crude oil.xls и набросок новой программы BF neft.xls По-моему обе программы несут совершенно одинаковую расчетную и функциональную нагрузку, старая даже большую. Только вот новая программка жутко медленно работает. Не могу понять, что забирает ресурсы? Над чем еще поработать? Help!!!! Последний раз редактировалось nemoomen; 15.03.2009 в 04:26. |
27.02.2009, 00:24 | #2 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Цитата:
Тормоза вижу, но точно установить, из-за чего они, пока не удалось. Прежде всего, в коде отсутствуют некоторые полезные операторы: Код:
Worksheet_SelectionChange, и, особенно, Worksheet_Change Конкретного пока ничего не могу предложить. Чуть попозже напишу, что изменить в коде, чтобы не тормозило. На каком действии у Вас больше всего проявляются тормоза? |
|
27.02.2009, 00:37 | #3 |
Пользователь
Регистрация: 26.02.2009
Сообщений: 58
|
Для начала я разработал "движок" с основным листом "Mine" в основе.
Все работало просло моментально, и я, окрыленный успехом "прицепил" к книге листы с бланками (цветные ярлычки). После этого и начались проблемы. Еще заметил - замедление происходит на тех кодах, которые делают перенос данных с места на место циклом с большим количеством шагов. |
27.02.2009, 00:38 | #4 |
Пользователь
Регистрация: 26.02.2009
Сообщений: 58
|
Одна из причин - огромные (из сотни строк) обработчики событий листа:
Worksheet_SelectionChange, и, особенно, Worksheet_Change Это и было основной идеей! Сравните интерфейс старой проги, обвешеной неудобными формами - и новую задумку!!! Последний раз редактировалось nemoomen; 27.02.2009 в 00:41. |
27.02.2009, 00:44 | #5 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Ерунда какая-то...
Простейший код (запись в 50 ячеек) выполняется аж 8 секунд! Код:
Комп современный, оперативки пустой предостаточно. Все обработчики событий отключил... Больше ничего не выполняется - открыт только этот файл Этот же код в пустом файле работает тоже 8 секунд (замечу, в этот момент оперативки свободной более гигабайта) Как только закрываю этот чудный файл - код отрабатывает моментально (в сотни тысяч раз быстрее) Кто может объяснить данный феномен? Только разве что разработчики Microsoft Проблема явно в файле. Причем Вы тут не виноваты... Можно попробовать создать пустой файл, и все данные вместе с макросами перекинуть в него. Времени это займёт много, но может помочь. Сейчас поищу другие варианты решения проблемы. |
27.02.2009, 00:53 | #6 |
Пользователь
Регистрация: 26.02.2009
Сообщений: 58
|
Подобные тесты я делал... И на разных машинах испытывал...
Я тоже не ожидал, что с моим наивным подходом к VBA and Excel возможно добраться до прдела их возможностей. По Вашему коду: Application.ScreenUpdating = False Application.EnableEvents = False ' код, вызывающий изменение ячеек на листе Mine Application.EnableEvents = True можно разъяснения получить? Справка по MsVB не помогла! Объяснюсь: на самом деле я крайне не опытем в програмировании на Визуале. Все, что применено в проге - наковырял из разных источников, иногда совершенно не понимая как это работает! |
27.02.2009, 00:57 | #7 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Почти нашел проблему.
Причина таких тормозов - в одном из листов файла BF neft.xls (причём не в главном листе Mine) Удалите все листы, кроме Mine - всё начинает работать моментально. Единственный способ локализовать проблему - удалять по одному листу из этого файла, а в другом файле (пустом) запускать простейший макрос: Код:
Листов много, так что выполнение этой проверки ложится на Вас. Когда скажете, в каком листе была причина - тогда установим точно, из-за чего это всё было. В любом случае, поможет копирование данных с проблемного листа на новый, и удаление старого листа. Возможно, что проблема в условном форматировании какой-нибудь ячейки на проблемном листе (если условное форматирование выполняется по результатам вычисления формулы) (в Excel есть такой документированный баг)
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 27.02.2009 в 00:59. |
27.02.2009, 01:09 | #8 | |||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Цитата:
Конечно, многое можно оптимизировать, но сейчас проблема не в этом. До предела возможностей Excel Вам ещё далеко. Это всего лишь один из редких глюков Excel. Цитата:
То есть, Вы можете макросом создавать новые книги или листы, переключаться между листами, вносить изменения в ячейки, но на экране ничего не будет отображаться до окончания работы макроса (или до команды Application.ScreenUpdating = true) К тому же, порой это значительно увеличивает скорость работы макроса. Следующий же код Application.EnableEvents = False ' код, вызывающий изменение ячеек на листе Mine Application.EnableEvents = True применяется для временного отключения событий (таких, как Worksheet_SelectionChange и Worksheet_Change) на время изменения значений на листе. К примеру, в Вашем макросе LoadToMine 19 раз происходит запись на лист Mine, и по умолчанию все эти 19 раз срабатывает немаленький макрос Worksheet_Change, что явно не способствует ускорению работы макроса. Использование же вышеприведённого кода позволит избежать этих ненужных срабатываний. (после выполнения макроса надо обязательно включать обработку событий снова, в отличии от обновления экрана, которое включается автоматически (в Вашей книге, кстати, не включается - виноват тот же глюк)) Цитата:
Там всё очень подробно описано (правда, на английском) На примере строки application.ScreenUpdating=False Ставите курсор посреди слова ScreenUpdating, и нажимаете F1 Через мгновение отобразится подробная справка по этому свойству.
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 27.02.2009 в 01:13. |
|||
27.02.2009, 01:10 | #9 |
Пользователь
Регистрация: 26.02.2009
Сообщений: 58
|
Тогда попутный вопрос:
Как "прошерстить" всю книгу на предмет поиска и удаления всех "условных форматирований" Еще вопрос: подскажите источник, в котором перечислены все операторы VBA Excel - книга или сайт. Желательно на русском. Тест несомненно сделаю, только уже не сегодня. К сожалению на судно бежать надо. Огромное промежуточное спасибо! |
27.02.2009, 01:16 | #10 | ||
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,856
|
Цитата:
Но делать этот макрос дольше, чем удалять листы по-одному. То, что во всём виновато условное форматирование - лишь предположение. Удаляйте листы по одному (начиная с последнего), и запускайте предложенный мной код. Так будет быстрее всего. Цитата:
Пока могу только посоветовать хороший ресурс по работе с Excel - http://msoffice.nm.ru/faq/macros.htm По операторам VBA (коих немного) лучше поискать отдельную книгу (или ресурс) Главное - разобраться в объектной модели Excel
__Полезные надстройки для Excel. Парсинг сайтов и файлов.
Макросы любой сложности на заказ. Мониторинг цен конкурентов Последний раз редактировалось EducatedFool; 27.02.2009 в 01:21. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите, пожалуйста, решить хоть что-то из этого. Очень нужно. | Андрэ | Фриланс | 6 | 10.12.2008 02:20 |
Помогите, пожалуйста, решить хоть что-то из этого. Очень нужно. | Андрэ | Помощь студентам | 1 | 07.12.2008 11:42 |
что нужно чтобы написать вирус? | JOFRIF | Свободное общение | 24 | 21.10.2008 01:38 |
Что нужно изменить, чтоб запрос заработал? | Paul Hindenburg | PHP | 1 | 08.10.2008 09:45 |
Помогите вникнуть в условие задачи. Что нужно сделать | garald50 | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 04.06.2008 19:42 |