Доброго дня! Пытаюсь переделать отчет из 1С. Использую функцию IndentLevel и по ее результатам циклом заполняю массив. Строк в отчете около 700. А обработка занимает около 10 минут. Помогите, плз, оптимизировать Кусок кода цикла. Полностью в файле [vba]
Код
For св_il = св_метка_nns + 2 To св_nnr св_v_il = .Cells(св_il, 1).IndentLevel .Cells(св_il, св_метка_nnc - 2).Value = св_v_il If св_v_il = 3 Then .Cells(св_il, св_метка_nnc - 1).Value = .Cells(св_il, 1).Value Else .Cells(св_il, св_метка_nnc - 1).Value = .Cells(св_il - 1, св_метка_nnc - 1).Value End If Next
[/vba] Добавлено в коде нашел несущественную ошибку, перезалил
Доброго дня! Пытаюсь переделать отчет из 1С. Использую функцию IndentLevel и по ее результатам циклом заполняю массив. Строк в отчете около 700. А обработка занимает около 10 минут. Помогите, плз, оптимизировать Кусок кода цикла. Полностью в файле [vba]
Код
For св_il = св_метка_nns + 2 To св_nnr св_v_il = .Cells(св_il, 1).IndentLevel .Cells(св_il, св_метка_nnc - 2).Value = св_v_il If св_v_il = 3 Then .Cells(св_il, св_метка_nnc - 1).Value = .Cells(св_il, 1).Value Else .Cells(св_il, св_метка_nnc - 1).Value = .Cells(св_il - 1, св_метка_nnc - 1).Value End If Next
[/vba] Добавлено в коде нашел несущественную ошибку, перезалилpabchek
У меня на 800 строк твой макрос отрабатывает моментально
1. Не нужно обращаться к ячейкам листа так часто. Сначала загрузи все в вирт. массив, а потом сразу выгрузи его на лист. http://perfect-excel.ru/publ....-1-0-74 2. Нет ли у тебя в файле всяких раскрасочек (особенно раскрасок границ ячеек)? Именованных диапазонов лишних? Прочей фигни всякой? 3. Не открыты ли еще какие-то огромные файлы? 4. Вначале макроса отключай обновление экрана Application.ScreenUpdating, пересчет формул Application.Calculation. А перед End - включай
У меня на 800 строк твой макрос отрабатывает моментально
1. Не нужно обращаться к ячейкам листа так часто. Сначала загрузи все в вирт. массив, а потом сразу выгрузи его на лист. http://perfect-excel.ru/publ....-1-0-74 2. Нет ли у тебя в файле всяких раскрасочек (особенно раскрасок границ ячеек)? Именованных диапазонов лишних? Прочей фигни всякой? 3. Не открыты ли еще какие-то огромные файлы? 4. Вначале макроса отключай обновление экрана Application.ScreenUpdating, пересчет формул Application.Calculation. А перед End - включай_Boroda_
эту ссылку знаю, изучаю, но пока не на "ты" 2-3. в самом деле, есть "огромный файл" он и тормозил. Я не знал, что на скорость выполнения "маленького" макроса влияет другой открытый, и вроде как неактивный файл. 4. да, обычно отключаю, в этом случае при отладке думал пусть лучше мигает
эту ссылку знаю, изучаю, но пока не на "ты" 2-3. в самом деле, есть "огромный файл" он и тормозил. Я не знал, что на скорость выполнения "маленького" макроса влияет другой открытый, и вроде как неактивный файл. 4. да, обычно отключаю, в этом случае при отладке думал пусть лучше мигаетpabchek
"Учиться, учиться и еще раз учиться!" WM: R399923528092
Почитав матчасть, свой вопрос решил следующим способом:
[vba]
Код
Sub обновление_сводной() Dim св_nnr%, св_nnc%, св_метка_nns%, св_метка_nnr%, св_метка_nnc%, св_метка_с%, св_il%, св_v_il% Dim св_il_база() As Integer, св_il_вставка() As String
On Error Resume Next With Sheets("Сводная") св_метка_nns = Application.Match("1. План продаж в стоимости продаж", .Range("A1:A20").Value, 0) св_nnr = .Range("A" & Rows.Count).End(xlUp).Row св_nnc = .Cells(св_nnr, Columns.Count).End(xlToLeft).Column св_метка_nnr = св_nnr - св_метка_nns + 1 св_метка_nnc = св_nnc + 4
ReDim св_il_база(1 To св_метка_nnr, 1 To 1) ReDim св_il_вставка(1 To св_метка_nnr, 1 To 1)
For св_il = св_метка_nns To св_nnr св_метка_с = св_il - св_метка_nns + 1 св_il_база(св_метка_с, 1) = .Cells(св_il, 1).IndentLevel If св_il_база(св_метка_с, 1) = 3 Then св_il_вставка(св_метка_с, 1) = .Cells(св_il, 1).Value Else св_il_вставка(св_метка_с, 1) = св_il_вставка(св_метка_с - 1, 1) End If Next
.Cells(св_метка_nns, св_метка_nnc - 1).Resize(св_метка_nnr, 1) = св_il_вставка End With End Sub
[/vba]
Летает даже с "огромным" файлом с кучей форматирования и других бяк
Почитав матчасть, свой вопрос решил следующим способом:
[vba]
Код
Sub обновление_сводной() Dim св_nnr%, св_nnc%, св_метка_nns%, св_метка_nnr%, св_метка_nnc%, св_метка_с%, св_il%, св_v_il% Dim св_il_база() As Integer, св_il_вставка() As String
On Error Resume Next With Sheets("Сводная") св_метка_nns = Application.Match("1. План продаж в стоимости продаж", .Range("A1:A20").Value, 0) св_nnr = .Range("A" & Rows.Count).End(xlUp).Row св_nnc = .Cells(св_nnr, Columns.Count).End(xlToLeft).Column св_метка_nnr = св_nnr - св_метка_nns + 1 св_метка_nnc = св_nnc + 4
ReDim св_il_база(1 To св_метка_nnr, 1 To 1) ReDim св_il_вставка(1 To св_метка_nnr, 1 To 1)
For св_il = св_метка_nns To св_nnr св_метка_с = св_il - св_метка_nns + 1 св_il_база(св_метка_с, 1) = .Cells(св_il, 1).IndentLevel If св_il_база(св_метка_с, 1) = 3 Then св_il_вставка(св_метка_с, 1) = .Cells(св_il, 1).Value Else св_il_вставка(св_метка_с, 1) = св_il_вставка(св_метка_с - 1, 1) End If Next
.Cells(св_метка_nns, св_метка_nnc - 1).Resize(св_метка_nnr, 1) = св_il_вставка End With End Sub
[/vba]
Летает даже с "огромным" файлом с кучей форматирования и других бяк pabchek