![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 13.08.2009
Сообщений: 10
|
![]()
Один и тот же макрос в Excel 2010 выполняется медленнее в 3 раза чем в Excel 2007. Может это связано с какими то проверками 2010, которых нет в 2007? Или тормоз есть в 2010, или то что 2010 тестовая версия, подскажите...
|
![]() |
![]() |
![]() |
#2 |
Новичок
СтарожилДжуниор
Регистрация: 05.02.2008
Сообщений: 9,487
|
![]()
чисто предположение:
томоз в данной ситуации - ваш компьютер. традиционно, новые версии (как офисов, так самих операционных систем от Майкрософт) все требовательнее к производительности железа.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 13.08.2009
Сообщений: 10
|
![]()
Думал за код программы, а оказывается собака не там зарыта.
Спасибо за ответ. |
![]() |
![]() |
![]() |
#4 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Вообще, если макрос тормозит, то это ещё не повод улучшать характеристики компа. Выкладывайте код - поможем оптимизировать, ускорив его в десяток раз. Тогда и тормозов замечать не будете. |
|
![]() |
![]() |
![]() |
#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 |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 13.08.2009
Сообщений: 10
|
![]()
С 27 сек. до 1 мин. переход в процессе написания кода в 2007, по мере усложнения. А попробовал конечный вариант в 2010 - более 3 минут.
Это меня конечно озадачило, что ж такое версия выше, а скорость ниже для одного и того же файла. |
![]() |
![]() |
![]() |
#7 |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]()
Во-первых, без примера файла (точнее, 2 файлов - содержащего макрос, и обрабатываемого), оптимизировать код не удастся.
Во-вторых, причины тормозов очевидны - в данном случае это:
Конечно, не зная, сколько листов в обрабатываемой книге, и сколько данных на каждом листе, сложно сказать, какое время понадобится макросу для обработки. Если по-максимуму оптимизировать макрос, можно сократить время обработки раз в 5-10, но процесс оптимизации макроса весьма трудоёмкий (надо его переделывать почти полностью - лист Прайс формировать в виде массива в памяти, и потом заносить сформированный массив на лист. Считывание с листов производить также через массивы) Если макрос запускается по десять раз на дню - имеет смысл этим заняться. Если же макрос запускается редко - проще не связываться, а просто набраться терпения... |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 13.08.2009
Сообщений: 10
|
![]()
Нет нет часто файл использоваться не будет. Обрабатываемый файл на сегодня имеет пару листов, строк чуть более 1000 на каждом, время затрачиваемое на работу макроса не велико, всё приемлемо. Просто меня удивило несоответствие времени работы в разных версиях Excel.
Группировки - так было в задаче, т.е. иметь их в результируюшем файле двойной линией с разбивкой. Без .Select не придумаю как сделать записи. За обработку в виде массива в памяти спасибо. Этот макрос переделывать не буду, но в дальнейшем обязательно воспользуюсь массивами. И возможно именно это даст ощутимый результат. |
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Вот тоже попробовал - в 2007 что-то делается за 1 секунду, в 2010 - за 3. Или, что хуже, в 2007 - 6, а в 2010 - все 20. Это очень плохо. Ведь пишешь макросы, а потом оказывается, что они будут тормозить... Ведь хочется пользоваться новыми возможностями Офиса, а там вдруг все тормозит
|
![]() |
![]() |
![]() |
#10 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Одно дело, если вы программно создаёте сотни листов или книг - тут вряд ли ускоришь процесс (хотя и тут есть способы), Ну а если столько времени тратится на вычисления - скорее всего проблема в алгоритме... Бывают, конечно, исключения, но... |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Макрос обработки данных для 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 |