Karen正在寻找一种打印整个工作簿的方法,即使用户选择打印单个工作表也是如此。换句话说,她正在寻找一种方法来打印整个工作簿,或者什么都不打印—应该没有“介于两者之间”的选项。

解决此问题的唯一方法是使用宏。 VBA允许您创建在某些事件发生时启动的宏。可以触发宏的事件之一是“打印”事件。当有人要求打印或选择查看打印预览时,将触发Workbook对象的BeforePrint事件。您可以创建自己的宏,该宏在触发事件时执行。

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_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(11629)适用于Microsoft Excel 2007、2010、2013和2016。您可以在下面的Excel的较旧菜单界面中找到此提示的版本:`link:/ excel-Printing_All_or_Nothing [全部打印或全部打印]。