【问题标题】:How do I set-up a Printing Macro to run two others macros before printing the pages如何设置打印宏以在打印页面之前运行另外两个宏
【发布时间】:2016-04-01 23:10:02
【问题描述】:

我是使用宏的新手,但我遇到了让我难过的情况。我有一个包含 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

当我运行它时,我得到一个编译错误:未定义子或函数。

【问题讨论】:

  • 我无法复制。还有其他代码吗?当您从 VBE 菜单中选择 Debug->Compile 时,哪一行会突出显示?
  • Sub Print_All_Pages() 以黄色突出显示,Call Hide_Blank_Rows2 以蓝色突出显示。
  • 完全错过了代码在 3 个地方之间传播。请参阅下面的答案。
  • 为什么将宏放在工作表代码模块上而不是正确的代码模块上?我真的不明白这一点......

标签: vba excel


【解决方案1】:

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

Sheet2.Hide_Blank_Rows2
Sheet3.Hide_Blank_Rows3

您可以省略 Call 关键字。

您也可以只将“隐藏”Subs 移动到模块中。如果你它们留在工作表上,用Me 替换对ActiveSheet 的引用将解决你还没有遇到的错误(在调用2 @987654326 之前你永远不会更改ActiveSheet @ 或它们之间):

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"

【讨论】:

  • 感谢共产国际。我将“ActiveSheet”更改为“Me”。它现在按我需要的方式工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多