在Excel中打印速度更快

时间:2008-10-23 16:17:11

标签: excel vba excel-vba printing

Excel(使用VBA)的打印功能非常慢。我希望有人有办法加快打印速度(不使用Excel 4 Macro技巧)。我现在就是这样做的:

Application.ScreenUpdating = False

With ActiveSheet.PageSetup

  -various setup statements which I've already minimized-

End With   
ActiveSheet.PrintOut

Application.ScreenUpdating = True

3 个答案:

答案 0 :(得分:8)

是的,设置它们时,PageSetup属性非常慢。

您已设置Application.ScreenUpdating = False,这很好,但在这种情况下,同等(或更重要)的重要步骤是设置Application.Calculation = xlCalculationManual。 (最好是保存这些设置,然后在最后将它们恢复为原始设置。)

此外,每个PageSetup属性的属性get都非常快,而只有属性集的速度非常慢。因此,您应该测试新属性设置,以确保它与现有属性值不同,以防止不必要(且昂贵)的调用。

考虑到所有这些,您应该能够使用类似于以下内容的代码:

Dim origScreenUpdating As Boolean
origScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False

Dim origCalcMode As xlCalculation
origCalcMode =  Application.Calculation
Application.Calculation = xlCalculationManual

With ActiveSheet.PageSetup
    If .PrintHeadings <> False Then .PrintHeadings = False
    If .PrintGridlines <> False Then .PrintGridlines = False
    If .PrintComments <> xlPrintNoComments Then .PrintComments = xlPrintNoComments
    ' Etc...
End With

Application.ScreenUpdating = origScreenUpdating
Application.Calculation = origCalcMode

编辑:一些更新:

  1. 对于Excel 2010及更高版本,您可以使用“Application.PrintCommunication”属性,而对于Excel 2007及更低版本,您可以使用“ExecuteExcel4Macro”。有关详细信息,请参阅Migrating Excel 4 Macros to VBA

  2. 对于Excel 2007及更低版本,另一个有趣的技巧是暂时将打印机驱动程序分配给“Microsoft XPS Document Writer”,然后将其重新设置。打印速度可提高3倍。请参阅:Slow Excel PageSetup Methods

  3. 希望这会有所帮助......

答案 1 :(得分:2)

在进一步发表Michael的帖子并回答@ rhc的问题时,如果需要将页面设置自定义从单个工作表复制到工作簿中的多个工作表,以下代码也可以帮助您:

Public Sub CopyPageSetupToAll(ByRef SourceSheet As Worksheet)
    ' Raise error if invalid source sheet is passed to procedure
    '
    If (SourceSheet Is Nothing) Then
        Err.Raise _
            Number:=vbErrorObjectVariableNotSet, _
            Source:="CopyPageSetupToAll", _
            Description:="Unable to copy Page Setup settings: " _
                 & "invalid reference to source sheet."
        Exit Sub
    End If

    SourceSheet.Activate

    With SourceSheet.PageSetup
        ' ...
        ' place PageSetup customizations here
        ' ...
    End With

    SourceSheet.Parent.Worksheets.Select
    Application.SendKeys "{ENTER}", True
    Application.Dialogs(xlDialogPageSetup).Show
End Sub

或者,您也可以修改过程以创建临时工作表来托管页面设置更改,然后将这些更改传播到工作簿中的其他工作表:

Public Sub CopyPageSetupToAll(ByRef SourceBook As Workbook)
    Dim tempSheet As Worksheet

    ' Raise error if invalid workbook is passed to procedure
    '
    If (SourceBook Is Nothing) Then
        Err.Raise _
            Number:=vbErrorObjectVariableNotSet, _
            Source:="CopyPageSetupToAll", _
            Description:="Unable to copy Page Setup settings: " _
                 & "invalid reference to source workbook."
        Exit Sub
    End If

    Set tempSheet = SourceBook.Worksheets.Add

    tempSheet.Activate

    With tempSheet.PageSetup
        ' ...
        ' place PageSetup customizations here
        ' ...
    End With

    SourceBook.Worksheets.Select
    Application.SendKeys "{ENTER}", True
    Application.Dialogs(xlDialogPageSetup).Show
    tempSheet.Delete

    Set tempSheet = Nothing
End Sub

由于使用了SendKeys()函数和Application.Dialogs功能,此代码不提供最清晰的解决方案。但是,它完成了工作。 :)

答案 2 :(得分:0)

如果您希望基本上为工作簿中的每个选项卡设置相同的页面设置,您可以通过设置一个工作表然后以某种方式将该工作表的设置复制到其他工作表来加快速度吗?这可能吗?