柯克问是否有一种方法可以有条件地控制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]。