Страницы: 1
RSS
Оптимизация работы макроса скрытия строк в режиме "Разметка страницы"
 
Добрый день.
У меня есть таблица которая должна идти на печать, для визуального облегчения был выбран режим "разметка страницы"

за пределами страницы в столбце "T" существует условие для макроса "?" или "!"
Код
Sub Hide()
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In Sheets("таблица").UsedRange.Rows("1:99").Cells
        If cell.Value = "?" Then cell.EntireRow.Hidden = True
    Next
    Application.ScreenUpdating = True
End Sub
Sub Show()
    Sheets("таблица").UsedRange.Rows.Hidden = False
End Sub

макрос скрывает строчки где есть условие "?" на не активном листе
но в режиме "разметка страницы" он это делает крайне медленно, а в режиме "обычный" он работает удовлетворительно.

собственно вопрос в том как ускорить работу макроса в режиме "разметка страницы"?
есть предположение чтобы макрос искал не по всем ячейкам а только в столбце "T"  но мне никак не получается это реализовать,
фаил прикрепил с макросом и таблицей.
Изменено: vikttur - 25.06.2021 12:19:04
 
Цитата
Kover написал:
есть предположение чтобы макрос искал не по всем ячейкам а только в столбце "T"
так и пишите искать в столбце Т
Код
For Each cell In Sheets("таблица").Range("T1:T99").Cells
Плюс можно запоминать сначала вид отображения страницы, а после выполнения кода возвращать:
Код
Sub Hide()
    Dim iWView&
    iWView = ActiveWindow.View 'запоминаем текущий вид окна
    ActiveWindow.View = xlNormalView 'меняем вид окна на обычный
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In Sheets("таблица").Range("T1:T99").Cells
        If cell.Value = "?" Then cell.EntireRow.Hidden = True
    Next
    ActiveWindow.View = iWView 'возвращаем вид окна
    Application.ScreenUpdating = True
End Sub
Sub Show()
    Sheets("таблица").UsedRange.Rows.Hidden = False
End Sub

P.S. Да, и по такому же принципу можно отключить разбиение на печатные страницы - это тоже неплохо тормозит процесс:
Код
Sub Hide()
    Dim iWView&
    iWView = ActiveWindow.View 'запоминаем текущий вид окна
    ActiveWindow.View = xlNormalView 'меняем вид окна на обычный
Dim iDPB As Boolean
iDPB = ActiveSheet.DisplayPageBreaks 'запоминаем статус разбиения на печатные страницы
ActiveSheet.DisplayPageBreaks = False 'убираем разбиение на печатные страницы
'основной код
ActiveSheet.DisplayPageBreaks = iDPB 'возвращаем разбиение на страницы, если оно было
Изменено: Дмитрий(The_Prist) Щербаков - 25.06.2021 11:05:54
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков,
Ваш вариант помог, но только если макрос работает на активном листе (скорость его работы заметно быстрее)
но если макрос запускать с другого листа, то по прежнему работает очень медленно
 
Цитата
Kover написал:
но если макрос запускать с другого листа
Вид отображения окна можно изменить только для активного листа. Значит активируйте сначала нужный лист, делайте все манипуляции, потом возвращайте.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Значит активируйте сначала нужный лист, делайте все манипуляции, потом возвращайте.
спасибо большое за эту рекомендацию, действительно через
Код
Worksheets("таблица").Activate
все получилось, но только не знаю какой синтаксис какой должен быть, чтобы вернуться на страницу макроса
поэтому банально опять активирую лист где макрос
в итоге все имеет такой вид
Код
Sub Hide()
Worksheets("таблица").Activate
    Dim iWView&
    iWView = ActiveWindow.View 'запоминаем текущий вид окна
    ActiveWindow.View = xlNormalView 'меняем вид окна на обычный
    Dim iDPB As Boolean
    iDPB = ActiveSheet.DisplayPageBreaks 'запоминаем статус разбиения на печатные страницы
    ActiveSheet.DisplayPageBreaks = False 'убираем разбиение на печатные страницы
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In Sheets("таблица").Range("T1:T99").Cells
    If cell.Value = "?" Then cell.EntireRow.Hidden = True
    Next
    ActiveWindow.View = iWView 'возвращаем вид окна
    ActiveSheet.DisplayPageBreaks = iDPB 'возвращаем разбиение на страницы, если оно было
    Application.ScreenUpdating = True
Worksheets("макрос").Activate
End Sub
 
Цитата
Kover написал:
какой должен быть, чтобы вернуться на страницу макроса
обычно делают так:
Код
Sub Hide()
    Dim ws as worksheet
    Dim iWView&
    set ws = activesheet 'запоминаем лист, с которого запустили код
    Worksheets("таблица").Activate
    iWView = ActiveWindow.View 'запоминаем текущий вид окна
    ActiveWindow.View = xlNormalView 'меняем вид окна на обычный
    Dim iDPB As Boolean
    iDPB = ActiveSheet.DisplayPageBreaks 'запоминаем статус разбиения на печатные страницы
    ActiveSheet.DisplayPageBreaks = False 'убираем разбиение на печатные страницы
    Dim cell As Range
    Application.ScreenUpdating = False
    For Each cell In Sheets("таблица").Range("T1:T99").Cells
    If cell.Value = "?" Then cell.EntireRow.Hidden = True
    Next
    ActiveWindow.View = iWView 'возвращаем вид окна
    ActiveSheet.DisplayPageBreaks = iDPB 'возвращаем разбиение на страницы, если оно было
    Application.ScreenUpdating = True
    ws.Activate 'активируем лист с макросом
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков,
Спасибо большое, еще раз. Приму для себя к сведению как это должно быть
 
Попробуйте ещё так:
Код
Sub Hide_2()
    Dim i As Long, rng As Range
    With Sheets("таблица")
        For i = 1 To 99
            If .Cells(i, 20).Value = "?" Then
                If rng Is Nothing Then Set rng = .Rows(i) Else Set rng = Union(rng, .Rows(i))
            End If
        Next i
        If Not rng Is Nothing Then rng.EntireRow.Hidden = True
    End With
End Sub
Изменено: msi2102 - 25.06.2021 12:37:49
 
А еще эффективнее автофильтр.
Владимир
 
Цитата
sokol92 написал:
автофильтр
у него база без шапки
 
Да, но можно добавить первую строку, поставить нужный автофильтр, затем скрыть первую строку и, кстати, столбец T.
Владимир
 
Так, кто знает, почему без шапки, может это критично  :D  
Страницы: 1
Наверх