Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ускорение процесса скрытия строк - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ускорение процесса скрытия строк (Макросы/Sub)
Ускорение процесса скрытия строк
Lyova Дата: Пятница, 30.06.2017, 16:14 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте!

Пользуясь макрорекордером и примерами на сайте соорудил такой код:

[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 пока что я чайник.


Сообщение отредактировал Lyova - Пятница, 30.06.2017, 16:33
 
Ответить
СообщениеЗдравствуйте!

Пользуясь макрорекордером и примерами на сайте соорудил такой код:

[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 пока что я чайник.

Автор - Lyova
Дата добавления - 30.06.2017 в 16:14
Pelena Дата: Пятница, 30.06.2017, 20:17 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 11261
Репутация: 2503 ±
Замечаний: 0% ±

Excel 2010, 2016 & Mac Excel
Lyova, подозреваю, что есть некий критерий, по которому скрываются строки именно указанных диапазонов. Постарайтесь всё же сделать файл-пример с небольшим количеством строк и приложите сюда. А так только похожие примеры
http://www.excelworld.ru/board....-1-0-36 (+комментарии)
только вместо .delete надо писать .hidden=true
Ещё вариант
удаление строк в большом Ексель файле


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеLyova, подозреваю, что есть некий критерий, по которому скрываются строки именно указанных диапазонов. Постарайтесь всё же сделать файл-пример с небольшим количеством строк и приложите сюда. А так только похожие примеры
http://www.excelworld.ru/board....-1-0-36 (+комментарии)
только вместо .delete надо писать .hidden=true
Ещё вариант
удаление строк в большом Ексель файле

Автор - Pelena
Дата добавления - 30.06.2017 в 20:17
Hugo Дата: Пятница, 30.06.2017, 21:21 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2674
Репутация: 599 ±
Замечаний: 0% ±

Попробуйте ещё отключить пересчёт на время работы, если используются формулы.
А вообще эксели разные бывают, мне вот на работе 365 не понравился, радуюсь возврату на 2010 - всё значительно шустрее происходит.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеПопробуйте ещё отключить пересчёт на время работы, если используются формулы.
А вообще эксели разные бывают, мне вот на работе 365 не понравился, радуюсь возврату на 2010 - всё значительно шустрее происходит.

Автор - Hugo
Дата добавления - 30.06.2017 в 21:21
KuklP Дата: Пятница, 30.06.2017, 22:10 | Сообщение № 4
Группа: Проверенные
Ранг: Старожил
Сообщений: 2186
Репутация: 466 ±
Замечаний: 0% ±

2003-2010
Не, ну в цикле скрывать по одной строчке - само по себе тормоз. Лучше заменить ноли на пусто и specialcells(4) одним махом скрыть. Да и в начале макроса лучше не по частям скрывать, а одним махом. yes


Ну, с НДС и мы чего-то стoим! bombb6@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеНе, ну в цикле скрывать по одной строчке - само по себе тормоз. Лучше заменить ноли на пусто и specialcells(4) одним махом скрыть. Да и в начале макроса лучше не по частям скрывать, а одним махом. yes

Автор - KuklP
Дата добавления - 30.06.2017 в 22:10
Lyova Дата: Пятница, 30.06.2017, 23:07 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Pelena, Здравствуйте! Вроде получилось уложиться в требования по объему. Даже в урезанном файле скрывает/открывает медленно, в оригинальном файле еще медленнее.

На сколько хватило ума, пользуясь рекордером, перед "If" вставил "Application.Calculation = xlManual", а перед "End Sub" "Application.Calculation = xlSemiautomatic". Как я думаю - это должно отключать вычисления на период выполнения макроса. Не поленился, засек на секундомере, в оригинальном файле на 1-1,5 секунды стало выполняться быстрее, хотя может и показалось.
К сообщению приложен файл: PRIMER.xlsb(63Kb)
 
Ответить
СообщениеPelena, Здравствуйте! Вроде получилось уложиться в требования по объему. Даже в урезанном файле скрывает/открывает медленно, в оригинальном файле еще медленнее.

На сколько хватило ума, пользуясь рекордером, перед "If" вставил "Application.Calculation = xlManual", а перед "End Sub" "Application.Calculation = xlSemiautomatic". Как я думаю - это должно отключать вычисления на период выполнения макроса. Не поленился, засек на секундомере, в оригинальном файле на 1-1,5 секунды стало выполняться быстрее, хотя может и показалось.

Автор - Lyova
Дата добавления - 30.06.2017 в 23:07
Lyova Дата: Пятница, 30.06.2017, 23:08 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
KuklP, Здравствуйте! Буду благодарен, если напишите, как это сделать
 
Ответить
СообщениеKuklP, Здравствуйте! Буду благодарен, если напишите, как это сделать

Автор - Lyova
Дата добавления - 30.06.2017 в 23:08
Lyova Дата: Пятница, 30.06.2017, 23:10 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Hugo, Здравствуйте! Сделал так, как в ответе Pelena. Допускаю, что сделал неправильно
 
Ответить
СообщениеHugo, Здравствуйте! Сделал так, как в ответе Pelena. Допускаю, что сделал неправильно

Автор - Lyova
Дата добавления - 30.06.2017 в 23:10
KuklP Дата: Суббота, 01.07.2017, 05:29 | Сообщение № 8
Группа: Проверенные
Ранг: Старожил
Сообщений: 2186
Репутация: 466 ±
Замечаний: 0% ±

2003-2010
[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
[/vba]


Ну, с НДС и мы чего-то стoим! bombb6@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Суббота, 01.07.2017, 05:49
 
Ответить
Сообщение[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
[/vba]

Автор - KuklP
Дата добавления - 01.07.2017 в 05:29
Lyova Дата: Суббота, 01.07.2017, 13:03 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
KuklP, Спасибо! Стало существенно быстрее!
 
Ответить
СообщениеKuklP, Спасибо! Стало существенно быстрее!

Автор - Lyova
Дата добавления - 01.07.2017 в 13:03
Lyova Дата: Суббота, 01.07.2017, 13:11 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
KuklP, Одновременно с приложенным файлом-примером открыл оригинальный., который весит 7,6 мб. Скорость работы макроса в фале-примере упала заметно, хотя в любом случае лучше, чем было раньше
 
Ответить
СообщениеKuklP, Одновременно с приложенным файлом-примером открыл оригинальный., который весит 7,6 мб. Скорость работы макроса в фале-примере упала заметно, хотя в любом случае лучше, чем было раньше

Автор - Lyova
Дата добавления - 01.07.2017 в 13:11
Lyova Дата: Суббота, 01.07.2017, 15:57 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
KuklP, Вставил код в оригинальный файл - так же тупит, быстрее не стало
 
Ответить
СообщениеKuklP, Вставил код в оригинальный файл - так же тупит, быстрее не стало

Автор - Lyova
Дата добавления - 01.07.2017 в 15:57
KuklP Дата: Суббота, 01.07.2017, 19:30 | Сообщение № 12
Группа: Проверенные
Ранг: Старожил
Сообщений: 2186
Репутация: 466 ±
Замечаний: 0% ±

2003-2010
Возможно(я же не видел файла) есть смысл отключить еще и события:
[vba]
Код
Application.enableevents=0
[/vba]Только не забудьте в конце включить.


Ну, с НДС и мы чего-то стoим! bombb6@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеВозможно(я же не видел файла) есть смысл отключить еще и события:
[vba]
Код
Application.enableevents=0
[/vba]Только не забудьте в конце включить.

Автор - KuklP
Дата добавления - 01.07.2017 в 19:30
Lyova Дата: Суббота, 01.07.2017, 21:50 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
KuklP, К сожалению эффекта нет:(
 
Ответить
СообщениеKuklP, К сожалению эффекта нет:(

Автор - Lyova
Дата добавления - 01.07.2017 в 21:50
KuklP Дата: Воскресенье, 02.07.2017, 11:38 | Сообщение № 14
Группа: Проверенные
Ранг: Старожил
Сообщений: 2186
Репутация: 466 ±
Замечаний: 0% ±

2003-2010
Тогда возможно сам файл слишком грузный и есть смысл подумать о его облегчении. Или хотя-бы разделить лист на два. Насколько я помню, там самые большие тормоза во время скрытия одного диапазона полностью и отображения другого. Скрытие пустых строк происходит мгновенно.


Ну, с НДС и мы чего-то стoим! bombb6@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеТогда возможно сам файл слишком грузный и есть смысл подумать о его облегчении. Или хотя-бы разделить лист на два. Насколько я помню, там самые большие тормоза во время скрытия одного диапазона полностью и отображения другого. Скрытие пустых строк происходит мгновенно.

Автор - KuklP
Дата добавления - 02.07.2017 в 11:38
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ускорение процесса скрытия строк (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!