Скорость выполнени кода отличается в разы

Программирование на Visual Basic for Applications
rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Скорость выполнени кода отличается в разы

Сообщение rdva » 26.01.2007 (Пт) 13:07

Написал большой (экранов пятнадцать) макрос , заметил, что к концу выполнение циклов, аналогичных применяемым в начале макроса, вроде бы замедляется. Провел эксперимет:
Добавил в конец " большого макроса"цикл удаление пробелов:

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

    With Worksheets("price.ru")
        For rwindex = 2 To .Range("A65535").End(xlUp).Row
            .Cells(rwindex, 1) = Trim(.Cells(rwindex, 1))
        Next rwindex
    End With


Запустил - на 5000 строк время выполнения ~3 минуты

Создал новую книгу, скопировал туда этот столбец с пробелами, все остальные книги закрыл, запустил макрос состоящий из одного этого цикла:

Код: Выделить всё
Sub aaa()
    With Worksheets("Лист1)
        For rwindex = 2 To .Range("A65535").End(xlUp).Row
            .Cells(rwindex, 1) = Trim(.Cells(rwindex, 1))
        Next rwindex
    End With
End Sub


И глаза вылезли на лоб - время выполнения ~3 секунды!
Почему происходит такое замедление?
Памяти свободной навалом: Машина - P4 2,8 Mhz, 1Gb ОЗУ, Excel 2003

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 13:22

With Worksheets("Лист1)

Прямо так и запустил?

А вообще - много чего может влиять:
1) События ведь небось не отключаешь?
2) Обновление экрана тоже?
3) Да еще и формул, наверное, напрописывал? ;)
У-у-у!!

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 26.01.2007 (Пт) 13:41

Очепятка, сорри.

1. Что такое события?
2. Обновления экрана отключаю - результат не меняется. Как было 20 минут, так и осталось.
3. Формулы есть, но не то чтобы много. Хотя много-мало - понятия относительные.

Попробовал сейчас открыть книгу с "большим макросом" (кстати долго она что-то открывается, секунд 40-60) и запустил "короткий макрос" в отдельной книге - короткий опять выполняется три минуты. Закрываю книгу с большим макросом - короткий выполняется 3 секунды.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 13:48

rdva
1. Что такое события?

Ясно. Значит, событий у тебя нет. :D это код, выполняющийся при наступлении каких-либо условий (изменение содержимого ячейки, выбор ячейки и т.д.).
3. Формулы есть, но не то чтобы много. Хотя много-мало - понятия относительные.

Я это к тому, что при изменении содержимого ячейки, формулы будут сразу пересчитываться (если их не отключить, конечно). 5000 ячеек - 5000 рекалькуляций. Хотя все равно странно. Формулы не могут давать ТАКИХ задержек. Тут надо код смотреть. А лучше сам файл.
У-у-у!!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 26.01.2007 (Пт) 14:25

Формулы МОГУТ давать "таких задержек". Поставь в книге много ВПР'ов по большой таблице - и попробуй потом поработать при автоматическом пересчете формул :)

Перед циклом:

Application.Calculation = xlCalculationManual
Application.Screenupdating=False

После цикла - xlCalculationAutomatic и True соответственно.
Быть... или не быть. Вот. В чём вопрос?

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 14:28

uhm писал(а):Формулы МОГУТ давать "таких задержек". Поставь в книге много ВПР'ов по большой таблице - и попробуй потом поработать при автоматическом пересчете формул :)

задержка в 20 минут?! Что за конфигурация компа?
У-у-у!!

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 26.01.2007 (Пт) 14:44

АЛИЛУЙЯ! :) Продвинутый гуру uhm не зря называется таковым! После Application.Calculation = xlCalculationManual время выполнения меньше минуты.
Спасибо!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.01.2007 (Пт) 14:46

Размеры файлов какие?
Lasciate ogni speranza, voi ch'entrate.

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Сообщение Genyaa » 26.01.2007 (Пт) 15:40

Поделюсь своим наболевшим... до кучи...

Я довольно часто использую разные макросы, которые формируют какие-то новые списки данных из других списков (происходит преобразование структуры, проверка корректности и т.д. с переносом данных из одних листов другие, формул очень мало или совсем нет)...

Так вот, что я заметил... если я в течение сеанса работы с Екселем редактировал процедуры макросов, то выполнение любых макросов после этого может в разы (если не в десятки разов) медленнее, чем если бы я выполнял эти же макросы с теми же данными в первом сеансе работы Екселя до редактирования макросов.
Всякое решение плодит новые проблемы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.01.2007 (Пт) 15:45

А не обращал внимания на команду "Компилировать"?
Lasciate ogni speranza, voi ch'entrate.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 15:45

Genyaa
Аналогично.
У-у-у!!

Genyaa
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 17.10.2006 (Вт) 13:46

Сообщение Genyaa » 26.01.2007 (Пт) 17:49

alibek писал(а):А не обращал внимания на команду "Компилировать"?

О! да, нужно проверить.. может поможет... спасибо. не думал, что это как-то связано... да и забыл, что есть такая команда :cry:
Всякое решение плодит новые проблемы.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 115

    TopList  
cron