Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2010, 17:00   #1
Владимир.
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 10
По умолчанию В Excel 2010 макрос медленнее в 3 раза чем в 2007

Один и тот же макрос в Excel 2010 выполняется медленнее в 3 раза чем в Excel 2007. Может это связано с какими то проверками 2010, которых нет в 2007? Или тормоз есть в 2010, или то что 2010 тестовая версия, подскажите...
Владимир. вне форума Ответить с цитированием
Старый 03.04.2010, 17:44   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

чисто предположение:
томоз в данной ситуации - ваш компьютер. традиционно, новые версии (как офисов, так самих операционных систем от Майкрософт) все требовательнее к производительности железа.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.04.2010, 17:54   #3
Владимир.
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 10
По умолчанию

Думал за код программы, а оказывается собака не там зарыта.
Спасибо за ответ.
Владимир. вне форума Ответить с цитированием
Старый 03.04.2010, 18:57   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Думал за код программы, а оказывается собака не там зарыта.
Бывают случаи (правда, редко), когда тормоза обусловлены переходом на другую версию Excel.

Вообще, если макрос тормозит, то это ещё не повод улучшать характеристики компа.
Выкладывайте код - поможем оптимизировать, ускорив его в десяток раз.
Тогда и тормозов замечать не будете.
EducatedFool вне форума Ответить с цитированием
Старый 03.04.2010, 21:33   #5
Владимир.
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 10
По умолчанию

Sub Макрос1()
Application.EnableCancelKey = xlDisabled
Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim wsSheet As Worksheet, r, r2, r1, n, i
Dim T, ij, ijk, bo, sh1, sh2, sh3
Dim ar()

T = Now
r = ActiveSheet.Name
Application.Calculation = xlCalculationManual
For Each wsSheet In ActiveWorkbook.Worksheets
wsSheet.Visible = xlSheetVisible
Next wsSheet


Workbooks.Open Filename:=Sheets("Кнопки").Cells(1, 1).Value
ijk = ActiveWorkbook.Sheets.Count
bo = ActiveWorkbook.Name
ReDim ar(ijk)
For ij = 1 To ijk
ar(ij) = Sheets(ij).Name
Next ij

For ij = 1 To ijk
Application.Calculation = xlCalculationManual
Workbooks(bo).Activate
Sheets(ar(ij)).Select
Set sh1 = ActiveSheet
ActiveCell.SpecialCells(xlLastCell) .Select
Selection.End(xlUp).Select
r2 = Selection.Row
Cells.Find(What:="Инвентарь", After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Select
r1 = Selection.Row + 1

ThisWorkbook.Sheets(Array("Скидки Реквизиты", "Прайс")).Copy
Sheets("Скидки Реквизиты").Select
Set sh3 = ActiveSheet

Sheets("Прайс").Select
Set sh2 = ActiveSheet

n = 0
For i = r1 To r2
sh1.Cells(i, 2).Copy sh2.Cells(7 + n, 1)
sh1.Cells(i, 4).Copy sh2.Cells(7 + n, 11)

sh1.Cells(i, 5).Copy sh2.Cells(7 + n, 4)
sh1.Cells(i, 6).Copy sh2.Cells(7 + n, 5)
sh1.Cells(i, 7).Copy sh2.Cells(7 + n, 6)
sh1.Cells(i, 8).Copy sh2.Cells(7 + n, 7)
n = n + 1
Next i


n = Empty
For i = r1 To r2
If sh2.Cells(7 + n, 11) <> "" Then sh2.Cells(7 + n, 2).Value = "шт."
n = n + 1
Next i
sh2.Rows(r1 & ":" & r2).Rows.Group
sh2.Rows(r1 & ":" & r2).Rows.Group
For i = 1 To r2 - r1 - 3
If sh2.Cells(8 + i, 11).Value = "" Then sh2.Rows(8 + i & ":" & 8 + i).Rows.Ungroup
If sh2.Cells(8 + i, 11).Value = "" And sh2.Cells(8 + i, 1).Interior.Color <> 16777215 Then sh2.Rows(8 + i & ":" & 8 + i).Rows.Ungroup
Next i

sh2.Range("M7").FormulaR1C1 = "=IF(R3C2=4,RC[-9]*RC[-1],IF(R3C2=3,RC[-8]*RC[-1],IF(R3C2=2,RC[-7]*RC[-1],IF(R3C2=1,RC[-6]*RC[-1],IF(R3C2=0,RC[-5]*RC[-1],IF(R3C2=5,RC[-4]*RC[-1],0))))))"
sh2.Range("M7").Copy sh2.Range("M7:M" & 7 + r2 - r1)
sh2.Range("M3").FormulaR1C1 = "=SUM(R[4]C:R[9997]C)"
sh2.Range("A2").Value = "На " & Date
sh3.Range("A23").FormulaR1C1 = "=""Прайс-лист от ""&RIGHT(Прайс!R[-21]C,10)"
Application.Calculation = xlCalculationAutomatic
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & Application.PathSeparator & ar(ij) & Date & ".xls", _
FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
ReadOnlyRecommended:=False, CreateBackup:=False
ActiveWorkbook.Close

Next ij

For Each wsSheet In ThisWorkbook.Worksheets
If wsSheet.Name <> r Then wsSheet.Visible = xlSheetVeryHidden
Next wsSheet

Workbooks(bo).Close
Set sh1 = Nothing: Set sh2 = Nothing: Set sh3 = Nothing
MsgBox "Время расчёта " & T & " - " & Now & vbCrLf & vbCrLf & "В новых файлах на листах ''Прайс'' в ячейке А2 проставлена сегодняшняя дата!"
Application.EnableCancelKey = True
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
Владимир. вне форума Ответить с цитированием
Старый 03.04.2010, 21:48   #6
Владимир.
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 10
По умолчанию

С 27 сек. до 1 мин. переход в процессе написания кода в 2007, по мере усложнения. А попробовал конечный вариант в 2010 - более 3 минут.
Это меня конечно озадачило, что ж такое версия выше, а скорость ниже для одного и того же файла.
Владимир. вне форума Ответить с цитированием
Старый 03.04.2010, 23:08   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Во-первых, без примера файла (точнее, 2 файлов - содержащего макрос, и обрабатываемого), оптимизировать код не удастся.

Во-вторых, причины тормозов очевидны - в данном случае это:
  • использование метода .Select
  • копирование ячеек внутри вложенных циклов sh1.Cells(i, 2).Copy sh2.Cells(7 + n, 1)
  • группировка и разгруппировка строк

Конечно, не зная, сколько листов в обрабатываемой книге, и сколько данных на каждом листе, сложно сказать, какое время понадобится макросу для обработки.

Если по-максимуму оптимизировать макрос, можно сократить время обработки раз в 5-10, но процесс оптимизации макроса весьма трудоёмкий (надо его переделывать почти полностью - лист Прайс формировать в виде массива в памяти, и потом заносить сформированный массив на лист. Считывание с листов производить также через массивы)

Если макрос запускается по десять раз на дню - имеет смысл этим заняться.
Если же макрос запускается редко - проще не связываться, а просто набраться терпения...
EducatedFool вне форума Ответить с цитированием
Старый 04.04.2010, 00:15   #8
Владимир.
Пользователь
 
Регистрация: 13.08.2009
Сообщений: 10
По умолчанию

Нет нет часто файл использоваться не будет. Обрабатываемый файл на сегодня имеет пару листов, строк чуть более 1000 на каждом, время затрачиваемое на работу макроса не велико, всё приемлемо. Просто меня удивило несоответствие времени работы в разных версиях Excel.

Группировки - так было в задаче, т.е. иметь их в результируюшем файле двойной линией с разбивкой. Без .Select не придумаю как сделать записи.
За обработку в виде массива в памяти спасибо. Этот макрос переделывать не буду, но в дальнейшем обязательно воспользуюсь массивами. И возможно именно это даст ощутимый результат.
Владимир. вне форума Ответить с цитированием
Старый 22.05.2010, 00:36   #9
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Вот тоже попробовал - в 2007 что-то делается за 1 секунду, в 2010 - за 3. Или, что хуже, в 2007 - 6, а в 2010 - все 20. Это очень плохо. Ведь пишешь макросы, а потом оказывается, что они будут тормозить... Ведь хочется пользоваться новыми возможностями Офиса, а там вдруг все тормозит
motorway вне форума Ответить с цитированием
Старый 22.05.2010, 01:01   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Или, что хуже, в 2007 - 6, а в 2010 - все 20
Обычно, если макрос выполняется дольше 1-2 секунд, надо пересматривать алгоритм...

Одно дело, если вы программно создаёте сотни листов или книг - тут вряд ли ускоришь процесс (хотя и тут есть способы),
Ну а если столько времени тратится на вычисления - скорее всего проблема в алгоритме...
Бывают, конечно, исключения, но...
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос обработки данных для Excel 2007 Python Фриланс 1 16.02.2010 20:47
Не вставить рисунок в Word 2007-2010 Tongo Microsoft Office Word 0 05.01.2010 20:24
Да тестостерона в 3 раза больше чем норма HellMercenariess Свободное общение 3 25.08.2009 22:52