Pergunta

A funcionalidade de impressão do Excel (utilizando VBA) é extremamente lento. Eu estou esperando que alguém tem uma maneira de acelerar a imprimir-se (sem usar o truque Macro Excel 4). Aqui está como eu fazer isso agora:

Application.ScreenUpdating = False

With ActiveSheet.PageSetup

  -various setup statements which I've already minimized-

End With   
ActiveSheet.PrintOut

Application.ScreenUpdating = True
Foi útil?

Solução

Sim, as propriedades PageSetup são muito lentos quando você defini-las.

Você já definiu Application.ScreenUpdating = False, que é bom, mas um igualmente (ou mais) importante passo neste caso é definir Application.Calculation = xlCalculationManual. (É melhor se você salvar essas configurações e, em seguida, restaurá-los para o original no final.)

Além disso, o get propriedade para cada propriedade PageSetup é muito rápido, enquanto ele é apenas o conjunto de propriedades que é tão lento. Portanto, você deve testar a nova configuração da propriedade para ter certeza que não é já o mesmo que o valor da propriedade existente, a fim de evitar uma ligação desnecessária (e caro).

Com tudo isso em mente, você deve ser capaz de usar o código que é algo como o seguinte:

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: Um par de atualizações:

  1. Para o Excel 2010 e acima, você pode fazer uso da propriedade 'Application.PrintCommunication', enquanto que para o Excel 2007 e abaixo, você pode fazer uso de 'ExecuteExcel4Macro'. Para mais detalhes, consulte Migrando Excel 4 macros para VBA .

  2. Para Excel 2007 e abaixo, um outro truque interessante é atribuir temporariamente o driver de impressora para o 'Microsoft XPS Document Writer' e, em seguida, configurá-lo de volta. A velocidade de impressão pode melhorar por 3x. Veja: lentas Métodos PageSetup Excel .

Espero que isso ajude ...

Outras dicas

Ao prosseguir com o post de Michael e respondendo @ pergunta de RHC, o seguinte código também pode ajudá-lo se necessidade de cópia da página personalizações de configuração a partir de uma única folha de cálculo para várias planilhas em uma pasta de trabalho:

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

Como alternativa, você também pode modificar o procedimento para criar uma planilha temporária para acolher as alterações de configuração de página, e em seguida, propagar essas alterações para as outras planilhas em sua pasta de trabalho:

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

Devido ao uso da funcionalidade função SendKeys() e Application.Dialogs, este código não oferece a solução mais limpa possível. No entanto, ele começa o trabalho feito. :)

Se você quiser ter basicamente as mesmas configurações de página para cada guia em uma pasta de trabalho você pode acelerar as coisas através da criação de um workshet e, em seguida, copiar as configurações desse planilha de alguma forma com as outras planilhas? Isso é possível?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top