Условная печать (Microsoft Excel)
Кирк спросил, есть ли способ условно контролировать то, что печатается в Excel. Например, ячейка A1 содержит значение, и это значение определяет, что именно печатается. Возможно, если A1 содержит 1, то печатается Sheet1; если он содержит 2, то печатаются Sheet1 и Sheet2.
Единственный способ сделать это — использовать макрос, и вы можете использовать несколько подходов. Рассмотрим следующий очень простой макрос, который просто использует структуру Select Case для управления печатью.
Sub PrintStuff() Dim vShts As Variant vShts = Sheets(1).Range("A1") If Not IsNumeric(vShts) Then Exit Sub Else Select Case vShts Case 1 Sheets("Sheet1").PrintOut Case 2 Sheets("Sheet2").PrintOut Case 3 Sheets("Sheet1").PrintOut Sheets("Sheet2").PrintOut End Select End If End Sub
Запустите этот макрос со значением 1, 2 или 3 в ячейке A1 первого листа, и макрос будет печатать разные вещи в зависимости от значения. Если значение равно 1, печатается Sheet1; если 2, то печатается Sheet2; а если это 3, то печатаются как Sheet1, так и Sheet2. Если вы хотите, чтобы разные значения печатали разные вещи, просто измените структуру Select Case, чтобы отразить возможные значения и то, что должно быть напечатано для каждого значения.
Также можно создать более комплексный подход. Подумайте о добавлении «контрольного листа» в свою книгу. На этом листе будет имя каждого рабочего листа в книге, указанного в первом столбце. Если вы поместите значение справа от имени рабочего листа во второй столбец, то макрос распечатает соответствующий рабочий лист.
Следующий макрос можно использовать для создания «контрольного листа».
Sub CreateControlSheet() Dim i as integer On Error Resume Next 'Delete this sheet if it already exists Sheets("Control Sheet").Delete On Error GoTo 0 Sheets.Add 'Add the WhatToPrint Sheet ActiveSheet.Name = "Control Sheet" Range("A1").Select 'Label the columns ActiveCell.FormulaR1C1 = "Sheet Name" Range("B1").Select ActiveCell.FormulaR1C1 = "Print?" Cells.Select Selection.Columns.AutoFit For i = 1 To ActiveWorkbook.Sheets.Count Cells(i + 1, 1).Value = Sheets(i).Name Next End Sub
Макрос сначала удаляет любой старый контрольный лист, если он существует. Затем он добавляет новый рабочий лист с именем Контрольный лист и помещает метки заголовков в столбцы A и B. Затем он перечисляет все рабочие листы в книге в столбце A.
Создав контрольный лист, вы можете поместить «X» или другое значение (например, «Y» или 1) в столбец B рядом с каждым листом, который хотите распечатать. Следующий макрос затем проверяет контрольный лист и распечатывает любой рабочий лист, имеющий отметку — любую отметку — в ячейке в столбце B.
Sub PrintSelectedSheets() Dim i as Integer i = 2 Do Until Sheets("Control Sheet").Cells(i, 1).Value = "" If Trim(Sheets("Control Sheet").Cells(i, 2).Value <> "") Then Sheets(Sheets("Control Sheet").Cells(i, 1).Value).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1 End If i = i + 1 Loop End Sub
Другой подход — создать макрос, который запускается непосредственно перед печатью.
(Печать — это одно из событий, которое Excel позволяет вам перехватить.) Следующий макрос, добавленный к объекту thisWorkbook, запускается при каждой попытке печати.
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim vShts As Variant Dim iResponse As Integer Dim bPreview As Boolean On Error GoTo ErrHandler vShts = Sheets(1).Range("A1") If Not IsNumeric(vShts) Then GoTo InValidEntry ElseIf vShts < 1 Or vShts > Sheets.Count Then GoTo InValidEntry Else iResponse = MsgBox(prompt:="Do you want Print Preview?", _ Buttons:=vbYesNoCancel, Title:="Preview?") Select Case iResponse Case vbYes bPreview = True Case vbNo bPreview = False Case Else Msgbox "Canceled at User request" GoTo ExitHandler End Select Application.EnableEvents = False Sheets(vShts).PrintOut Preview:=bPreview End If ExitHandler: Application.EnableEvents = True Cancel = True Exit Sub InValidEntry: MsgBox "'" & Sheets(1).Name & "'!A1" _ & vbCrLf & "must have a number between " _ & "1 and " & Sheets.Count & vbCrLf GoTo ExitHandler ErrHandler: MsgBox Err.Description Resume ExitHandler End Sub
Макрос проверяет значение в ячейке A1 первого листа. Он использует это значение, чтобы определить, какие листы следует распечатать. Другими словами, 1 печатает первый лист, 2 печатает второй, 3 печатает третий и так далее.
Если значение в A1 не является значением или если оно меньше 1 или больше, чем количество листов в книге, то пользователю сообщается, что значение неверно, и макрос закрывается.
Предполагая, что значение в A1 находится в пределах диапазона, макрос спрашивает, хотите ли вы использовать предварительный просмотр. В зависимости от ответа пользователя макрос распечатывает указанный рабочий лист или отображает предварительный просмотр печати для этого рабочего листа.
_Примечание: _
Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.
link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера]
.
ExcelTips — ваш источник экономичного обучения Microsoft Excel.
Этот совет (13108) применим к Microsoft Excel 2007, 2010, 2013, 2016, 2019 и Excel в Office 365. Вы можете найти версию этого совета для старого интерфейса меню Excel здесь:
link: / excel-Conditional_Printing [Условная печать]
.