如何在打印页面之前设置打印宏以运行另外两个宏

时间:2016-04-01 23:10:03

标签: excel vba excel-vba

我是使用Macros的新手,但我遇到了让我难过的情况。我有一个包含3个工作表的工作簿(“检查报告”,“设备列表”和“缺陷”)。我在“设备列表”上有一个宏,在“缺陷”上有一个隐藏空白行的宏。我想在“检查报告”上创建一个宏,它将操作宏以在打印所有3页之前隐藏空白行。

这是我的代码。前两个Sub分别在各自的工作表上,最后一个在模块中。

Sub Hide_Blank_Rows2()
'Hide blank rows on "Device List"
  ActiveSheet.Unprotect Password:=""

    Application.ScreenUpdating = 0
    On Error Resume Next
    [b12:b1108].SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    Application.ScreenUpdating = 1
  ActiveSheet.Protect Password:=""

End Sub
Sub Hide_Blank_Rows3()
'Hide blank rows on "Deficiencies"
  ActiveSheet.Unprotect Password:=""

    Application.ScreenUpdating = 0
    On Error Resume Next
    [b49:b156].SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    Application.ScreenUpdating = 1
  ActiveSheet.Protect Password:=""

End Sub
Sub Print_All_Pages()
'
' Run Macros to hide blank rows then print all three worksheets
'
Call Hide_Blank_Rows2
Call Hide_Blank_Rows3
'
    Sheets(Array("Inspection Report", "Device List", "Deficiencies")).Select
    Sheets("Inspection Report").Activate
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, _
        IgnorePrintAreas:=False

End Sub

当我运行这个时,我得到一个编译错误:Sub或Function not defined。

1 个答案:

答案 0 :(得分:1)

由于“隐藏”Subs位于工作表而不是模块中,因此它们是各自工作表的方法。您需要指定调用该方法的对象,即(使用Sheet2和Sheet3作为示例):

Sheet2.Hide_Blank_Rows2
Sheet3.Hide_Blank_Rows3

您可以省略Call关键字。

您也可以将“隐藏”子项移动到模块。如果您保留在工作表上,将ActiveSheet的引用替换为Me将解决您尚未遇到的错误(在调用之前,您永远不会更改ActiveSheet 2 Subs或它们之间):

Sub Hide_Blank_Rows2()
'Hide blank rows on "Device List"
  Me.Unprotect Password:=""

    Application.ScreenUpdating = 0
    On Error Resume Next
    [b12:b1108].SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    Application.ScreenUpdating = 1
  Me.Protect Password:=""

End Sub

如果您 将它们移动到模块,您将需要专门处理要运行的工作表,以便解决您尚未到达的错误。我个人只是将它们组合成一个Sub这样的东西......

Sub Hide_Blank_Rows(sh As Worksheet, targetRange As String)
    sh.Unprotect Password:=""
    Application.ScreenUpdating = 0
    On Error Resume Next
    sh.Range(targetRange).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    Application.ScreenUpdating = 1
    sh.Protect Password:=""
End Sub

...并将其放在与Sub Print_All_Pages()相同的位置。

你会这样称呼:

Hide_Blank_Rows Sheets("Device List"), "B12:B1108"
Hide_Blank_Rows Sheets("Deficiencies"), "B49:B156"