Question

La fonctionnalité d'impression d'Excel (à l'aide de VBA) est extrêmement lente. J'espère que quelqu'un aura un moyen d'accélérer l'impression (sans utiliser l'astuce Excel 4 Macro). Voici comment je le fais maintenant:

Application.ScreenUpdating = False

With ActiveSheet.PageSetup

  -various setup statements which I've already minimized-

End With   
ActiveSheet.PrintOut

Application.ScreenUpdating = True
Était-ce utile?

La solution

Oui, les propriétés de PageSetup sont très lentes lorsque vous les définissez.

Vous avez déjà défini Application.ScreenUpdating = False , ce qui est bien, mais une étape tout aussi importante (ou plus) dans ce cas consiste à définir Application.Calculation = xlCalculationManual . (Il est préférable de sauvegarder ces paramètres, puis de les restaurer à la fin.)

En outre, la propriété get pour chaque propriété PageSetup est très rapide, alors que seul le jeu de propriétés est très lent. Par conséquent, vous devez tester le nouveau paramètre de propriété pour vous assurer qu'il n'est pas déjà identique à la valeur de la propriété existante afin d'éviter tout appel inutile (et coûteux).

En gardant cela à l'esprit, vous devriez pouvoir utiliser un code ressemblant à ceci:

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

Edit: quelques mises à jour:

  1. Pour Excel 2010 et les versions ultérieures, vous pouvez utiliser la propriété "Application.PrintCommunication", tandis que pour Excel 2007 et les versions ultérieures, vous pouvez utiliser "ExecuteExcel4Macro". Pour plus de détails, voir Migration de macros Excel 4 vers VBA .

  2. Pour Excel 2007 et les versions ultérieures, une autre astuce intéressante consiste à affecter temporairement le pilote d’imprimante au "Microsoft XPS Document Writer", puis à le restaurer. La vitesse d'impression peut être multipliée par 3. Voir: Méthodes Slow Excel .

J'espère que cela vous aidera ...

Autres conseils

En approfondissant le message de Michael et en répondant à la question de @ rhc, le code suivant peut également vous aider si vous devez copier les personnalisations de mise en page à partir d'une seule feuille de calcul vers plusieurs feuilles de calcul dans un classeur:

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

Vous pouvez également modifier la procédure pour créer une feuille de calcul temporaire afin d'héberger vos modifications de mise en page, puis les propager aux autres feuilles de votre classeur:

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

En raison de l'utilisation de la fonction SendKeys () et de la fonctionnalité Application.Dialogs , ce code n'offre pas la solution la plus propre possible. Cependant, le travail est fait. :)

Si vous voulez avoir les mêmes paramètres de page pour chaque onglet d'un classeur, pouvez-vous accélérer les choses en configurant un seul brouillon, puis en copiant les paramètres de cette brouillon dans les autres feuilles? Est-ce possible?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top