Добрый день. У меня есть таблица которая должна идти на печать, для визуального облегчения был выбран режим "разметка страницы"
за пределами страницы в столбце "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" но мне никак не получается это реализовать, фаил прикрепил с макросом и таблицей.
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) Щербаков, Ваш вариант помог, но только если макрос работает на активном листе (скорость его работы заметно быстрее) но если макрос запускать с другого листа, то по прежнему работает очень медленно
Дмитрий(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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
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