Страницы: 1
RSS
что поменять чтобы работало быстрее???
 
Доброго всем времани суток.  
есть макрос добавляющий шаблон на лист. сначала он выполнялся примерно пару сеунд, постепено он совершенствовался и рос, теперь он выполняется примерно минуту, а то и две.... подскажите что в нем можно поменять чтобы он работал побыстрее или что для этого сделать???
 
собсно сам макрос  
Sub простобланк()  
Application.ScreenUpdating = False  
Sheets("заявки на ЗЧ").Activate  
Cells(Rows.Count, 2).End(xlUp).Select  
ActiveCell.Offset(0, 0) = "марка"  
ActiveCell.Offset(-1, 2) = Date  
ActiveCell.Offset(-1, 5) = "=IF(ISERROR(OFFSET('[запись кузовного.xlsx]запись'!R1C15,MATCH(R[7]C[-3],'[запись кузовного.xlsx]запись'!R3C15:R2999C15,0),-7)),IF(ISERROR(OFFSET('[запись кузовного.xlsx]отданные'!R1C15,MATCH(R[7]C[-3],'[запись кузовного.xlsx]отданные'!R3C15:R2999C15,0),-7)),"""",""в отданных""),OFFSET('[запись кузовного.xlsx]запись'!R1C15,MATCH(R[7]C[-3],'[запись кузовного.xlsx]запись'!R3C15:R2999C15,0),-7))"
 
model = ActiveCell.Offset(0, 1).Address  
marka = ActiveCell.Offset(-1, 1).Address  
   With ActiveCell.Offset(-1, 1).Validation  
       .Delete  
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _  
       xlBetween, Formula1:="=марка"  
       .IgnoreBlank = True  
       .InCellDropdown = True  
       .ShowInput = True  
       .ShowError = True  
   End With  
ActiveCell.Offset(-1, 1) = "выбор_марки"  
ActiveCell.Offset(0, 0) = "модэль"  
Nom = ActiveCell.Offset(0, 1).Address  
   myReferenceStyle = Application.ReferenceStyle  
Application.ReferenceStyle = xlR1C1  
With ActiveCell.Offset(-1, 1).Validation  
.Delete  
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=indirect(R[-1]C)"
.InCellDropdown = True  
End With  
Application.ReferenceStyle = myReferenceStyle  
 
ActiveCell.Offset(5, 2) = "=" & model & "&" & Nom  
ActiveCell.Offset(5, 2).Font.Italic = True  
ActiveCell.Offset(0, 0) = "гос номер"  
ActiveCell.Offset(0, 0) = "VIN"  
ActiveCell.Offset(0, 0) = "год"  
ActiveCell.Offset(0, 0) = "цвет"  
ActiveCell.Offset(0, 0) = "страховая"  
With ActiveCell.Offset(-1, 1).Validation  
       .Delete  
       .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _  
       xlBetween, Formula1:="=страховые"  
       .IgnoreBlank = True  
       .InCellDropdown = True  
       .ShowInput = True  
       .ShowError = False  
   End With  
ActiveCell.Offset(0, 1).NumberFormat = "@"  
ActiveCell.Offset(0, 0) = "№заказ-наряда"  
ActiveCell.Offset(0, 0) = "к-во деталей"  
ActiveCell.Offset(0, 2) = "=IFERROR(OFFSET('[запись кузовного.xlsx]отданные'!R1C15,MATCH(R[-1]C,'[запись кузовного.xlsx]отданные'!R2C15:R2999C15,0),-7),"""")"
ActiveCell.Offset(-1, 1) = "=IF(SUM(R[1]C:R[4]C)=0,"""",SUM(R[1]C:R[4]C))"
ActiveCell.Offset(-1, 3) = "=IF(SUM(R[1]C:R[4]C)=0,"""",SUM(R[1]C:R[4]C))"
ActiveCell.Offset(1, 1) = "=IF(RC[-1]="""","""",1)"
ActiveCell.Offset(2, 1) = "=IF(RC[-1]="""","""",1)"
ActiveCell.Offset(0, 0) = "Реферанс"  
ActiveCell.Offset(-1, -1) = "№"  
ActiveCell.Offset(-1, 1) = "Кол-во"  
ActiveCell.Offset(-1, 2) = "Наименоваеие"  
ActiveCell.Offset(-1, 3) = "получено"  
ActiveCell.Offset(-1, 4) = "Цена"  
ActiveCell.Offset(-1, 5) = "на складе"  
ActiveCell.Offset(-1, 6) = "в сервисных"  
ActiveCell.Offset(-1, 7) = "в заявках"  
ActiveCell.Offset(-1, 8) = "в заказах"  
ActiveCell.Offset(-1, 9) = "заказано"  
ActiveCell.Offset(0, -1) = "=IF(RC[1]="""","""",if(rc[1]=""дозаказ"",""№"",IF(R[-1]C=""№"",1,R[-1]C+1)))"
ActiveCell.Offset(0, 2) = "=IFERROR(IF(ISERROR(OFFSET(INDIRECT(""'прайс "" & RC[9]& ""'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс "" & RC[9]& ""'!R2C1:R50000C1"",FALSE),0),2)),OFFSET(INDIRECT(""'прайс Рено'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс рено'!R2C1:R50000C1"",FALSE),0),2),OFFSET(INDIRECT(""'прайс "" & RC[9]& ""'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс "" & RC[9]& ""'!R2C1:R50000C1"",FALSE),0),2)),"""")"
ActiveCell.Offset(0, 4) = "=IFERROR(IF(ISERROR(OFFSET(INDIRECT(""'прайс "" & RC[7]& ""'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс "" & RC[7]& ""'!R2C1:R50000C1"",FALSE),0),1)),OFFSET(INDIRECT(""'прайс Рено'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс рено'!R2C1:R50000C1"",FALSE),0),1),OFFSET(INDIRECT(""'прайс "" & RC[7]& ""'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс "" & RC[7]& ""'!R2C1:R50000C1"",FALSE),0),1)),"""")"
ActiveCell.Offset(0, 5) = "=iferror(OFFSET('прайс Рено'!R1C1,MATCH(RC[-5],'прайс Рено'!R2C1:R10000C1,0),6),"""")"
ActiveCell.Offset(0, 6) = "=iferror(OFFSET('прайс Рено'!R1C1,MATCH(RC[-6],'прайс Рено'!R2C1:R10000C1,0),7),"""")"
ActiveCell.Offset(0, 7) = "=SUMIF(C[-7],RC[-7],C[-6])"
ActiveCell.Offset(0, 8) = "=IFERROR(OFFSET(заказы!R1C1,MATCH(RC[-8],заказы!R2C1:R10000C1,0),2),"""")"
ActiveCell.Offset(1, -1) = "=IF(RC[1]="""","""",if(rc[1]=""дозаказ"",""№"",IF(R[-1]C=""№"",1,R[-1]C+1)))"
Range(ActiveCell.Offset(-1, -1), ActiveCell.Offset(-1, 9)).Borders.Weight = xlMedium  
Range(ActiveCell.Offset(0, -1), ActiveCell.Offset(1, 9)).Borders.LineStyle = xlContinuous  
ActiveCell.Offset(2, 0) = "марка"  
 
For x = 1 To 12  
ActiveCell.Offset(x - 14, 10) = "=" & model & "&" & Nom  
ActiveCell.Offset(x - 14, 11) = "=" & marka  
Next  
Application.ScreenUpdating = True  
End Sub  
 
 
 
работает он в свяске с    
Private Sub Worksheet_Change(ByVal Target As Range)  
 
 
   If Not Intersect(Target, Range("b:b")) Is Nothing Then  
       Target.Offset(1, 0).Select  
       Application.EnableEvents = False  
       If ActiveCell = "марка" Then  
           Selection.EntireRow.Insert  
           Range(ActiveCell.Offset(0, -1), ActiveCell.Offset(0, 9)).Borders.LineStyle = xlContinuous  
           Target.Offset(0, -1) = "=IF(RC[1]="""","""",if(rc[1]=""дозаказ"",""№"",IF(R[-1]C=""№"",1,R[-1]C+1)))"
           Target.Offset(1, 1) = "=IF(RC[-1]="""","""",1)"
           Target.Offset(0, 2) = "=IFERROR(IF(ISERROR(OFFSET(INDIRECT(""'прайс "" & RC[9]& ""'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс "" & RC[9]& ""'!R2C1:R50000C1"",FALSE),0),2)),OFFSET(INDIRECT(""'прайс Рено'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс рено'!R2C1:R50000C1"",FALSE),0),2),OFFSET(INDIRECT(""'прайс "" & RC[9]& ""'!R1C1"",FALSE),MATCH(RC[-2],INDIRECT(""'прайс "" & RC[9]& ""'!R2C1:R50000C1"",FALSE),0),2)),"""")"
           Target.Offset(0, 4) = "=IFERROR(IF(ISERROR(OFFSET(INDIRECT(""'прайс "" & RC[7]& ""'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс "" & RC[7]& ""'!R2C1:R50000C1"",FALSE),0),1)),OFFSET(INDIRECT(""'прайс Рено'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс рено'!R2C1:R50000C1"",FALSE),0),1),OFFSET(INDIRECT(""'прайс "" & RC[7]& ""'!R1C1"",FALSE),MATCH(RC[-4],INDIRECT(""'прайс "" & RC[7]& ""'!R2C1:R50000C1"",FALSE),0),1)),"""")"
           Target.Offset(0, 5) = "=iferror(OFFSET('прайс Рено'!R1C1,MATCH(RC[-5],'прайс Рено'!R2C1:R10000C1,0),6),"""")"
           Target.Offset(0, 6) = "=iferror(OFFSET('прайс Рено'!R1C1,MATCH(RC[-6],'прайс Рено'!R2C1:R10000C1,0),7),"""")"
           Target.Offset(0, 7) = "=SUMIF(C[-7],RC[-7],C[-6])"
           Target.Offset(0, 8) = "=IFERROR(OFFSET(заказы!R1C1,MATCH(RC[-8],заказы!R2C1:R10000C1,0),2),"""")"
           x = Target.Offset(-1, 10).Address  
           y = Target.Offset(-1, 11).Address  
           Target.Offset(1, 10) = "=" & x  
           Target.Offset(1, 11) = "=" & y  
           Target.Offset(1, -1) = "=IF(RC[1]="""","""",if(rc[1]=""дозаказ"",""№"",IF(R[-1]C=""№"",1,R[-1]C+1)))"
       End If  
       If ActiveCell.Offset(-1, 0) = "дозаказ" Then  
       Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(-1, 9)) = ""  
       End If  
   End If  
Application.EnableEvents = True  
End Sub
 
{quote}{login=The_Prist}{date=30.10.2009 03:11}{thema=}{post}Если честно, я поменял бы весь макрос...Уж очень много формул. Они действительно так нужны?  
Но пока посоветовал бы добавить после этой строки Application.ScreenUpdating = False такую строку  
Application.Calculation = xlmanual  
а в конце макроса соответственно    
Application.Calculation = xlAutomatic{/post}{/quote}  
 
формулы ОООООЧень нужны.  
они колосально экономят рабочее время, но на создание шаблона уходит СТОЛЬКО времени...... хотя всёравно так проше работать:)
 
{quote}{login=The_Prist}{date=30.10.2009 03:21}{thema=}{post}Мне еще вот эти строки в макросе не ясны:  
ActiveCell.Offset(0, 0) = "гос номер"  
ActiveCell.Offset(0, 0) = "VIN"  
ActiveCell.Offset(0, 0) = "год"  
ActiveCell.Offset(0, 0) = "цвет"  
ActiveCell.Offset(0, 0) = "страховая"  
Вы в одной ячейке несколько раз меняете значения. Зачем?{/post}{/quote}  
 
макрос Private Sub Worksheet_Change(ByVal Target As Range)  
меняет активную строку на следующую
 
{quote}{login=The_Prist}{date=30.10.2009 03:40}{thema=}{post}ActiveCell.Offset(0, 0) = "гос номер"  
ActiveCell.Offset(0, 0) = "VIN"  
ActiveCell.Offset(0, 0) = "год"  
ActiveCell.Offset(0, 0) = "цвет"  
ActiveCell.Offset(0, 0) = "страховая"  
 
=  
 
Range(ActiveCell,ActiveCell.Offset(5)).Value = Array("гос номер", "VIN", "год", "цвет", "страховая")  
 
Старайтесь избегать изобилия Select-ов. Они О-о-о-очень сильно тормозят работу макроса.{/post}{/quote}  
 
а чем кстати select отличается от activate???  
и что делает Application.EnableEvents ????
Страницы: 1
Читают тему
Наверх