有条件打印(Microsoft Excel)
柯克问是否有一种方法可以有条件地控制Excel中打印的内容。例如,单元格A1包含一个值,并且该值精确控制要打印的内容。也许如果A1包含1,则打印Sheet1;否则,打印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
在第一张工作表的单元格A1中使用值1、2或3运行此宏,然后该宏根据该值打印不同的内容。如果值为1,则打印Sheet1。如果为2,则打印Sheet2;如果为3,则同时打印Sheet1和Sheet2。如果要使用不同的值打印不同的内容,只需修改“选择大小写”结构以反映可能的值以及应为每个值打印的内容。
也可以创建更全面的方法。考虑在您的工作簿中添加一个“控制表”。该工作表将具有第一栏中列出的工作簿中每个工作表的名称。如果在第二列中在工作表名称的右侧放置一个值,则宏将打印相应的工作表。
以下宏可用于创建“控制表”。
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列中列出所有工作表。
创建控制表后,您可以在要打印的每个工作表旁边的B列中放置一个“ X”或其他值(例如“ Y”或1)。然后,下面的宏检查控制表并在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对象的以下宏。
宏检查第一个工作表的单元格A1中的值。它使用此值来确定应打印哪些工作表。换句话说,a打印第一张工作表,a 2打印第二张工作表,a 3打印第三张工作表,依此类推。
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或大于工作簿中工作表的数量,则将通知用户该值不正确,并退出宏。
假设A1中的值在范围内,则宏会询问您是否要使用“打印预览”。根据用户的响应,宏将打印指定的工作表或显示该工作表的“打印预览”。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(2372)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007和更高版本)找到本技巧的版本:
链接:/ excelribbon-Conditional_Printing [Conditional Printing]。