富兰克林(Franklin)有一个宏,该宏隐藏工作表中的某些行,然后打印该工作表。为此,他使用了BeforePrint事件处理程序。问题是,富兰克林想在打印完成后自动取消隐藏行。他不知道如何在宏中执行此操作。

有几种方法可以解决此问题。一种是使用BeforePrint事件处理程序,并使用它来隐藏所需的行,然后指定要通过OnTime方法运行的宏。事件处理程序的外观如下:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

' Code here to hide rows desired

Application.OnTime Now, "AfterPrint"

End Sub

您需要向该事件处理程序添加代码以隐藏要隐藏的行。 (富兰克林说他正在处理这样的代码;打印出来后他隐瞒了问题。)请注意,通过OnTime调用的宏就是一个称为AfterPrint的宏。该宏应放置在常规模块中,而不是与事件处理程序放置在同一模块中。它甚至比事件处理程序还简单:

Sub AfterPrint()

' Code here to unhide rows     Cells.Select     Selection.EntireRow.Hidden = False End Sub

如果需要,您还可以完全忽略对OnTime方法(和AfterPrint宏)的需要。这将涉及此方法:

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Cancel = True     ' Code here to hide rows desired

Application.EnableEvents = False     ActiveSheet.PrintOut     Application.EnableEvents = True

' Code here to unhide rows End Sub

该宏之所以起作用,是因为它取消了触发BeforePrint事件的打印,隐藏行,打印出活动的工作表,然后取消隐藏行。

任何这种基于事件处理程序的方法的缺点在于,它限制了用户可以打印的内容。换句话说,用户只能打印您允许他们打印的内容,而不能打印他们实际想要打印的内容。为了解决这个相当大的限制,您将需要完全放弃BeforePrint方法。而是创建一个处理打印的常规宏:

Sub PrintWS()

' Code here to hide rows desired

Application.EnableEvents = False     ActiveSheet.PrintOut     Application.EnableEvents = True

' Code here to unhide rows End Sub

您会注意到,从本质上讲,这是第二种BeforePrint方法的实质-隐藏行,打印工作表,然后取消隐藏行。然后可以将此PrintWS宏绑定到快捷键或快速访问工具栏上的某些内容,以便轻松调用它。

顺便说一句,如果您决定使用一种BeforePrint方法,则有报告称它在所有版本的Excel中均无法正常工作。 (这似乎很难追踪。)发生的情况是,在某些版本中,Excel的打印内容在调用BeforePrint事件处理程序之前是“固定的”。这意味着在实际打印工作表时,您在事件处理程序中隐藏的任何行都将被忽略,就好像您从未在宏中隐藏行一样。解决这个令人沮丧的事实的唯一方法是直接通过上面的第二个BeforePrint示例或PrintWS宏方法直接处理打印。

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

本提示(13624)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。