Imprimer plus rapidement dans Excel
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
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:
-
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 .
-
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?