Выполнение макроса после завершения печати (Microsoft Excel)
У Франклина есть макрос, который скрывает некоторые строки на листе, а затем печатает лист. Для этого он использует обработчик событий BeforePrint. Проблема в том, что Франклин хочет автоматически отображать строки после завершения печати. Он не знает, как это сделать в своем макросе.
Есть несколько способов подойти к этому. Один из них — использовать обработчик событий BeforePrint и использовать его, чтобы скрыть нужные строки, а затем указать макрос для запуска с помощью метода OnTime. Вот как будет выглядеть обработчик события:
Private Sub Workbook_BeforePrint(Cancel As Boolean) ' Code here to hide rows desired Application.OnTime Now, "AfterPrint" End Sub
Вам нужно будет добавить в этот обработчик событий код, чтобы скрыть строки, которые вы хотите скрыть. (Франклин сказал, что у него был такой код, и у него были проблемы с их отображением после печати.) Обратите внимание, что макрос, вызываемый через OnTime, называется AfterPrint. Этот макрос следует размещать в обычном модуле, а не в том же модуле, что и обработчики событий. Это может быть даже проще, чем обработчик событий:
Sub AfterPrint() ' Code here to unhide rows Cells.Select Selection.EntireRow.Hidden = False End Sub
Вы также можете, если хотите, полностью обойтись без метода OnTime (и макроса AfterPrint). Это потребует такого подхода:
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True ' Code here to hide rows desired Application.EnableEvents = False ActiveSheet.PrintOut Application.EnableEvents = True ' Code here to unhide rows End Sub
Макрос работает, потому что он отменяет печать, вызвавшую событие BeforePrint, скрывает строки, распечатывает активный рабочий лист, а затем отображает строки.
Недостатком любого такого подхода, основанного на обработчиках событий, является то, что он ограничивает то, что пользователь может печатать. Другими словами, пользователь может распечатать только то, что вы ему разрешили, а не то, что он действительно хочет распечатать. Чтобы обойти это довольно большое ограничение, вам нужно полностью отказаться от подхода BeforePrint. Вместо этого создайте обычный макрос, обрабатывающий печать:
Sub PrintWS() ' Code here to hide rows desired Application.EnableEvents = False ActiveSheet.PrintOut Application.EnableEvents = True ' Code here to unhide rows End Sub
Вы заметите, что это, по сути, внутренности второго подхода BeforePrint — вы скрываете строки, распечатываете рабочий лист и затем показываете строки. Затем этот макрос PrintWS можно привязать к сочетанию клавиш или чему-то еще на панели быстрого доступа, чтобы его можно было легко вызвать.
Кстати, если вы решите использовать один из подходов BeforePrint, были сообщения о том, что он не работает должным образом во всех версиях Excel. (Это кажется очень трудным для отслеживания.) Что происходит, так это то, что в некоторых версиях Excel печатает «в камне» до вызова обработчика события BeforePrint. Это означает, что любые строки, которые вы скрываете в обработчике событий, игнорируются, когда рабочий лист фактически распечатывается, так что это как если бы вы никогда не скрывали строки в макросе. Единственный способ обойти этот очень неприятный факт — выполнить печать самостоятельно, используя второй пример BeforePrint выше или подход макроса PrintWS.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (13624) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365.