Pregunta

La funcionalidad de impresión de Excel (usando VBA) es extremadamente lenta. Espero que alguien tenga una forma de acelerar la impresión (sin usar el truco de Macro de Excel 4). Así es como lo hago ahora:

Application.ScreenUpdating = False

With ActiveSheet.PageSetup

  -various setup statements which I've already minimized-

End With   
ActiveSheet.PrintOut

Application.ScreenUpdating = True
¿Fue útil?

Solución

Sí, las propiedades de PageSetup son muy lentas cuando las configura.

Ya has configurado Application.ScreenUpdating = False , lo cual es bueno, pero un paso igualmente importante (o más) en este caso es configurar Application.Calculation = xlCalculationManual . (Es mejor si guarda estas configuraciones y luego las restaura al original al final.)

Además, la propiedad que se obtiene para cada propiedad PageSetup es muy rápida, mientras que solo el conjunto de propiedades es tan lento. Por lo tanto, debe probar la nueva configuración de propiedad para asegurarse de que ya no sea la misma que el valor de propiedad existente para evitar una llamada innecesaria (y costosa).

Teniendo todo esto en cuenta, deberías poder utilizar un código similar al siguiente:

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

Editar: un par de actualizaciones:

  1. Para Excel 2010 y superior, puede utilizar la propiedad 'Application.PrintCommunication', mientras que para Excel 2007 y posterior, puede utilizar 'ExecuteExcel4Macro'. Para obtener más detalles, consulte Migración de macros de Excel 4 a VBA .

  2. Para Excel 2007 y versiones posteriores, otro truco interesante es asignar temporalmente el controlador de impresora al 'Escritor de documentos XPS de Microsoft' y luego volver a configurarlo. La velocidad de impresión puede mejorar en 3x. Vea: Excel Excel PageSetup Methods .

Espero que esto ayude ...

Otros consejos

Al avanzar en la publicación de Michael y responder a la pregunta de @ rhc, el siguiente código también puede ayudarlo si necesita copiar las personalizaciones de Configuración de página de una sola hoja de trabajo a varias hojas de trabajo en un libro de trabajo:

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

Alternativamente, también puede modificar el procedimiento para crear una hoja de trabajo temporal para alojar sus cambios de Configuración de página, y luego propagar esos cambios a las otras hojas de trabajo en su libro:

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

Debido al uso de la función SendKeys () y la funcionalidad Application.Dialogs , este código no ofrece la solución más limpia posible. Sin embargo, hace el trabajo. :)

si desea tener básicamente la misma configuración de página para cada pestaña de un libro de trabajo, ¿puede acelerar las cosas configurando una hoja de trabajo y luego copiando la configuración de esa hoja de trabajo de alguna manera a las otras hojas de trabajo? ¿Es esto posible?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top