2008-10-23 8 views
3

La fonctionnalité d'impression d'Excel (en utilisant VBA) est extrêmement lente. J'espère que quelqu'un a un moyen d'accélérer l'impression (sans utiliser l'astuce Macro Excel 4). Voici comment je le fais maintenant:Comment imprimer plus rapidement dans Excel VBA?

Application.ScreenUpdating = False 

With ActiveSheet.PageSetup 

    -various setup statements which I've already minimized- 

End With 
ActiveSheet.PrintOut 

Application.ScreenUpdating = True 

Répondre

8

Oui, les propriétés PageSetup sont très lents 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 est de définir Application.Calculation = xlCalculationManual. (Il est préférable de sauvegarder ces paramètres et de les restaurer dans l'original à la fin.)

De plus, la propriété get pour chaque propriété PageSetup est très rapide, alors que seul le jeu de propriétés est si 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 propriété existante afin d'éviter un appel inutile (et coûteux).

Avec tout cela à l'esprit, vous devriez être en mesure d'utiliser le code qui ressemble à quelque chose comme ce qui suit:

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 ci-dessus vous pouvez utiliser la propriété 'Application.PrintCommunication', tandis que pour Excel 2007 et ci-dessous, vous pouvez utiliser 'ExecuteExcel4Macro'. Pour plus de détails, voir Migrating Excel 4 Macros to VBA.

  2. Pour Excel 2007 et les versions ultérieures, une autre astuce intéressante consiste à affecter temporairement le pilote d'imprimante à Microsoft XPS Document Writer, puis à le rétablir. La vitesse d'impression peut améliorer de 3x. Voir: Slow Excel PageSetup Methods.

Hope this helps ...

+0

Je vais tester cela, et vous dire comment cela a fonctionné pour moi. –

+0

J'ai été en mesure d'obtenir une augmentation considérable, la plupart de mes ensembles étaient des valeurs non booléennes, savez-vous si le programme d'installation d'impression est par feuille ou classeur? –

+0

Hey Lance, oui, vous pouvez obtenir une très grande amélioration en suivant cette approche - Je suis heureux que cela a fonctionné pour vous. :-) La mise en page est pour chaque feuille de calcul individuellement, pas pour le classeur dans son ensemble.(La classe Worksheeet a une propriété PageSetup, mais pas la classe Workbook.) –

0

si vous voulez avoir basiquement les mêmes paramètres de la page pour chaque onglet dans un classeur que vous pouvez accélérer les choses en mettant en place un workshet puis copier les paramètres de cette feuille de calcul en quelque sorte aux autres feuilles de travail? Est-ce possible?

2

Dans la poursuite du poste de Michael et la réponse, le code suivant à la question de @ RHC peut également vous aider si besoin de copier la page personnalisations de l'installation à partir d'une seule feuille de calcul à 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 

Sinon, vous pouvez modifier également la procédure pour créer une feuille de calcul temporaire pour héberger votre site les modifications de configuration, puis propager ces changements vers les autres feuilles de calcul dans 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 Application.Dialogs fonctionnalité, ce code n'offre pas la solution la plus propre possible. Cependant, il fait le travail. :)