Карен ищет способ распечатать всю книгу, даже если пользователь решит распечатать один рабочий лист. Другими словами, она ищет способ распечатать либо всю книгу, либо вообще ничего — не должно быть никаких «промежуточных» вариантов.

Единственный способ справиться с этим — использовать макрос. VBA позволяет создавать макросы, которые запускаются при наступлении определенных событий. Одно из событий, которое может запускать макросы, — это событие «печать». Когда кто-то запрашивает печать или выбирает предварительный просмотр печати, запускается событие BeforePrint объекта Workbook. Вы можете создать свой собственный макрос, который будет выполняться при срабатывании события.

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Dim sht As Variant     Dim bPreview As Boolean     Dim iResponse As Integer     On Error GoTo ErrHandler

iResponse = MsgBox(prompt:="Do you want to Print Preview?", _         Buttons:=vbYesNoCancel, Title:="Preview?")



Select Case iResponse         Case vbYes             bPreview = True         Case vbNo             bPreview = False         Case Else             GoTo ExitHandler     End Select     Application.EnableEvents = False     For Each sht In Sheets         If sht.Visible Then             sht.PrintOut Preview:=bPreview         End If     Next

ExitHandler:

Application.EnableEvents = True     Cancel = True     Exit Sub

ErrHandler:

MsgBox Err.Description     Resume ExitHandler End Sub

Каждый раз, когда Excel готовится к печати или когда вызывается предварительный просмотр печати, запускается событие BeforePrint и запускается этот макрос. Макрос сначала спрашивает пользователя, хочет ли он выполнить предварительный просмотр печати. Структура Select Case используется для установки переменной bPreview на основе ответа на вопрос. Затем настройка bPreview контролирует, что происходит.

Если пользователь щелкнул «Отмена», когда его спросили о предварительном просмотре, макрос закрывается и печать отменяется. В противном случае каждый лист в книге проверяется для печати или предварительного просмотра. Если рабочий лист виден, он распечатывается, а свойство Preview устанавливается равным bPreview (True означает, что рабочий лист предварительно просматривается; False означает, что он фактически напечатан).

Обратите внимание, что макрос устанавливает для свойства EnableEvents значение False. Это сделано для того, чтобы никакие другие события не могли запускаться во время печати или предварительного просмотра.

Если EnableEvents оставить «включенным», то каждый раз, когда используется метод PrintOut, все событие BeforePrint снова запускается — пользователь попадет в бесконечный цикл, если обработка событий не будет отключена.

Также обратите внимание, что одна из последних вещей, которые должны произойти перед выходом из макроса, — это то, что для свойства Cancel установлено значение True. Это сделано для того, чтобы исходный запрос на печать или предварительный просмотр печати, вызвавший событие BeforePrint, был отменен. В конце концов, нет необходимости выполнять этот запрос, поскольку макрос выполнял всю обработку печати для пользователя.

Конечно, есть одно предостережение при использовании этого подхода к печати: если макросы не включены, обработчик не запустится, и пользователь сможет печатать по своему усмотрению. (Удерживание Shift при открытии книги отключает макросы, и в большинстве случаев пользователя спрашивают, хотят ли они включить макросы.) Этот факт обсуждается и в других вопросах ExcelTips.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (11629) применим к Microsoft Excel 2007, 2010, 2013 и 2016.

Вы можете найти версию этого совета для старого интерфейса меню Excel здесь: link: / excel-Printing_All_or_Nothing [Printing All or Nothing].