Пользуясь макрорекордером и примерами на сайте соорудил такой код:
[vba]
Код
Sub TimeSchedulesProject() Application.ScreenUpdating = False If Range("TimeSchedules!B2") = 2 Then Rows("52:90").Hidden = False Rows("282:320").Hidden = False Rows("11:51").Hidden = True Rows("91:236").Hidden = True Rows("241:281").Hidden = True Rows("321:466").Hidden = True Dim rng4 As Range, rng5 As Range, rng6 As Range Dim b As Long Set rng4 = Worksheets("Input").Range("D64:D102") Set rng5 = Range("A52:A90") Set rng6 = Range("A282:A320") For b = 1 To rng4.Rows.Count If rng4.Cells(b, 1).Value = "" Or rng4.Cells(b, 1).Value = 0 Then rng5.Rows(b).Hidden = True rng6.Rows(b).Hidden = True Else rng5.Rows(b).Hidden = False rng6.Rows(b).Hidden = False End If Next b End If Application.ScreenUpdating = True End Sub
[/vba]
Непосредственно файл не могу приложить, потому что он очень большой.
Привожу часть кода, поскольку он дублируется в зависимости от значения в ячейке Range("TimeSchedules!B2"). (значения могут быть от 1 до 7)
Так вот, код делает то, что мне надо, но делает очень медленно. На скрытие/ открытие строк уходит 5-6 секунд - что напрягает. Возможно ли как-то оптимизировать код, чтобы он выполнялся быстрее?
P.S. В VBA пока что я чайник.
Здравствуйте!
Пользуясь макрорекордером и примерами на сайте соорудил такой код:
[vba]
Код
Sub TimeSchedulesProject() Application.ScreenUpdating = False If Range("TimeSchedules!B2") = 2 Then Rows("52:90").Hidden = False Rows("282:320").Hidden = False Rows("11:51").Hidden = True Rows("91:236").Hidden = True Rows("241:281").Hidden = True Rows("321:466").Hidden = True Dim rng4 As Range, rng5 As Range, rng6 As Range Dim b As Long Set rng4 = Worksheets("Input").Range("D64:D102") Set rng5 = Range("A52:A90") Set rng6 = Range("A282:A320") For b = 1 To rng4.Rows.Count If rng4.Cells(b, 1).Value = "" Or rng4.Cells(b, 1).Value = 0 Then rng5.Rows(b).Hidden = True rng6.Rows(b).Hidden = True Else rng5.Rows(b).Hidden = False rng6.Rows(b).Hidden = False End If Next b End If Application.ScreenUpdating = True End Sub
[/vba]
Непосредственно файл не могу приложить, потому что он очень большой.
Привожу часть кода, поскольку он дублируется в зависимости от значения в ячейке Range("TimeSchedules!B2"). (значения могут быть от 1 до 7)
Так вот, код делает то, что мне надо, но делает очень медленно. На скрытие/ открытие строк уходит 5-6 секунд - что напрягает. Возможно ли как-то оптимизировать код, чтобы он выполнялся быстрее?
Lyova, подозреваю, что есть некий критерий, по которому скрываются строки именно указанных диапазонов. Постарайтесь всё же сделать файл-пример с небольшим количеством строк и приложите сюда. А так только похожие примеры http://www.excelworld.ru/board....-1-0-36 (+комментарии) только вместо .delete надо писать .hidden=true Ещё вариант удаление строк в большом Ексель файле
Lyova, подозреваю, что есть некий критерий, по которому скрываются строки именно указанных диапазонов. Постарайтесь всё же сделать файл-пример с небольшим количеством строк и приложите сюда. А так только похожие примеры http://www.excelworld.ru/board....-1-0-36 (+комментарии) только вместо .delete надо писать .hidden=true Ещё вариант удаление строк в большом Ексель файлеPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Попробуйте ещё отключить пересчёт на время работы, если используются формулы. А вообще эксели разные бывают, мне вот на работе 365 не понравился, радуюсь возврату на 2010 - всё значительно шустрее происходит.
Попробуйте ещё отключить пересчёт на время работы, если используются формулы. А вообще эксели разные бывают, мне вот на работе 365 не понравился, радуюсь возврату на 2010 - всё значительно шустрее происходит.Hugo
Не, ну в цикле скрывать по одной строчке - само по себе тормоз. Лучше заменить ноли на пусто и specialcells(4) одним махом скрыть. Да и в начале макроса лучше не по частям скрывать, а одним махом.
Не, ну в цикле скрывать по одной строчке - само по себе тормоз. Лучше заменить ноли на пусто и specialcells(4) одним махом скрыть. Да и в начале макроса лучше не по частям скрывать, а одним махом. KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728
Pelena, Здравствуйте! Вроде получилось уложиться в требования по объему. Даже в урезанном файле скрывает/открывает медленно, в оригинальном файле еще медленнее.
На сколько хватило ума, пользуясь рекордером, перед "If" вставил "Application.Calculation = xlManual", а перед "End Sub" "Application.Calculation = xlSemiautomatic". Как я думаю - это должно отключать вычисления на период выполнения макроса. Не поленился, засек на секундомере, в оригинальном файле на 1-1,5 секунды стало выполняться быстрее, хотя может и показалось.
Pelena, Здравствуйте! Вроде получилось уложиться в требования по объему. Даже в урезанном файле скрывает/открывает медленно, в оригинальном файле еще медленнее.
На сколько хватило ума, пользуясь рекордером, перед "If" вставил "Application.Calculation = xlManual", а перед "End Sub" "Application.Calculation = xlSemiautomatic". Как я думаю - это должно отключать вычисления на период выполнения макроса. Не поленился, засек на секундомере, в оригинальном файле на 1-1,5 секунды стало выполняться быстрее, хотя может и показалось.Lyova
Sub TimeSchedulesProject() Application.ScreenUpdating = 0 Application.Calculation = xlManual On Error Resume Next If [TimeSchedules!B2] = 1 Then Range("9:47,93:131").EntireRow.Hidden = False Range("48:88,132:171").EntireRow.Hidden = True Dim rng1 As Range, s$ Set rng1 = Worksheets("Input").Range("D5:D42") rng1.Replace 0, "", xlWhole s = rng1.SpecialCells(4).Address(0, 0) If Len(s) Then Range(s).Offset(4).EntireRow.Hidden = True Range(s).Offset(88).EntireRow.Hidden = True End If End If If [TimeSchedules!B2] = 2 Then Range("9:49,93:132").EntireRow.Hidden = -1 Range("50:88,133:171").EntireRow.Hidden = 0 Set rng1 = Worksheets("Input").Range("D48:D85") rng1.Replace 0, "", xlWhole s = rng1.SpecialCells(4).Address(0, 0) If Len(s) Then Range(s).Offset(2).EntireRow.Hidden = True Range(s).Offset(85).EntireRow.Hidden = True End If End If Application.Calculation = xlSemiautomatic Application.ScreenUpdating = -1 End Sub
[/vba]
[vba]
Код
Sub TimeSchedulesProject() Application.ScreenUpdating = 0 Application.Calculation = xlManual On Error Resume Next If [TimeSchedules!B2] = 1 Then Range("9:47,93:131").EntireRow.Hidden = False Range("48:88,132:171").EntireRow.Hidden = True Dim rng1 As Range, s$ Set rng1 = Worksheets("Input").Range("D5:D42") rng1.Replace 0, "", xlWhole s = rng1.SpecialCells(4).Address(0, 0) If Len(s) Then Range(s).Offset(4).EntireRow.Hidden = True Range(s).Offset(88).EntireRow.Hidden = True End If End If If [TimeSchedules!B2] = 2 Then Range("9:49,93:132").EntireRow.Hidden = -1 Range("50:88,133:171").EntireRow.Hidden = 0 Set rng1 = Worksheets("Input").Range("D48:D85") rng1.Replace 0, "", xlWhole s = rng1.SpecialCells(4).Address(0, 0) If Len(s) Then Range(s).Offset(2).EntireRow.Hidden = True Range(s).Offset(85).EntireRow.Hidden = True End If End If Application.Calculation = xlSemiautomatic Application.ScreenUpdating = -1 End Sub
KuklP, Одновременно с приложенным файлом-примером открыл оригинальный., который весит 7,6 мб. Скорость работы макроса в фале-примере упала заметно, хотя в любом случае лучше, чем было раньше
KuklP, Одновременно с приложенным файлом-примером открыл оригинальный., который весит 7,6 мб. Скорость работы макроса в фале-примере упала заметно, хотя в любом случае лучше, чем было раньшеLyova
Тогда возможно сам файл слишком грузный и есть смысл подумать о его облегчении. Или хотя-бы разделить лист на два. Насколько я помню, там самые большие тормоза во время скрытия одного диапазона полностью и отображения другого. Скрытие пустых строк происходит мгновенно.
Тогда возможно сам файл слишком грузный и есть смысл подумать о его облегчении. Или хотя-бы разделить лист на два. Насколько я помню, там самые большие тормоза во время скрытия одного диапазона полностью и отображения другого. Скрытие пустых строк происходит мгновенно.KuklP
Ну с НДС и мы чего-то стoим! kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728