FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireLes impressions

Ce chapitre de la FAQ présente quelques exemples pour imprimer les classeurs. Lorsque vous faites des essais ou que vous souhaitez simplement avoir une idée du résultat de votre travail, utilisez l'option d'aperçu avant impression. Vous économiserez ainsi de l'encre, du papier et du temps.
Plus généralement, il faut toujours avoir une réflexion sur l'utilisation du papier pour ne pas le gaspiller.

Créé le 14 mai 2007  par SilkyRoad

Pour imprimer le classeur, utilisez:

Vba
Sélectionnez

ThisWorkbook.PrintOut
Vba
Sélectionnez

'spécifiez l'argument "Copies" pour définir le nombre de copies (3 dans cet exemple).
ActiveWorkbook.PrintOut Copies:=3, Collate:=True




Pour imprimer une feuille spécifique:

Vba
Sélectionnez

Worksheets("Feuil2").PrintOut




pour imprimer une plage de cellules:

Vba
Sélectionnez

Worksheets("Feuil1").Range("A1:D10").printOut
Créé le 14 mai 2007  par SilkyRoad

Pour effectuer un aperçu de la Feuille nommée "Feuil2", utilisez la méthode PrintPreview:

Vba
Sélectionnez

Worksheets("Feuil2").PrintPreview




Vous pouvez aussi effectuer l'aperçu avant impression en utilisant les boîtes de dialogues intégrées d'Excel:

Vba
Sélectionnez

Application.Dialogs(xlDialogPrintPreview).Show

Remarque:
L'argument False permet de rendre inactifs les boutons "Mise en page" et "Marges".

Vba
Sélectionnez

Application.Dialogs(xlDialogPrintPreview).Show False
Créé le 14 mai 2007  par SilkyRoad

Cette macro boucle sur les liens de la feuille active et ouvre le fichier lié s'il s'agit d'un classeur.
Chaque feuille de ce classeur est ensuite imprimée.

Vba
Sélectionnez

Sub imprimerPageActiveEt_Liensclasseurs()
Dim Lien As Hyperlink
Dim I As Byte
 
Application.ScreenUpdating = False
'Imprime la feuille active
ActiveSheet.PrintOut
 
'Boucle sur les liens de la feuille active
For Each Lien In ActiveSheet.Hyperlinks
    'Vérifie si le lien correspond à un classeur
    If Right(Range(Lien.Range.Address).Hyperlinks(1).Address, 4) = ".xls" Then
        'Déclenche le lien pour ouvrir le classeur
        Range(Lien.Range.Address).Hyperlinks(1).Follow NewWindow:=False
 
        'Imprime le classeur
        ActiveWorkbook.PrintOut
 
        'Referme le classeur
        ActiveWorkbook.Close
    End If
Next
 
Application.ScreenUpdating = True
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub impressionNoirEtBlanc()
    With Worksheets("Feuil1")
        .PageSetup.BlackAndWhite = True 'paramétrage N&B
        .PrintOut 'imprime
        .PageSetup.BlackAndWhite = False 'réinitialisation
    End With
End Sub
Créé le 14 mai 2007  par SilkyRoad

La procédure suivante affiche la boîte de dialogue d'impression, en précisant le nombre de copies par défaut (3).

Vba
Sélectionnez

Application.Dialogs(xlDialogPrint).Show , , , 3




Cet autre exemple affiche la boîte de dialogue permettant de choisir l'imprimante pour l'édition:

Vba
Sélectionnez

If Application.Dialogs(xlDialogPrinterSetup).Show = True Then Feuil1.printOut
Créé le 14 mai 2007  par SilkyRoad

Si les macros sont activées dans le classeur, vous pouvez utiliser l'évènement Workbook_BeforePrint.


Vba
Sélectionnez

Private Sub Workbook_BeforePrint(Cancel As Boolean)
Cancel = True
End Sub



Cet évènement survient avant l'impression. L'impression commence uniquement à l'issue de cette procédure.
Le paramètre Cancel = True bloque toute impression.

Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub listeImprimantes_et_Statut()
'testé avec Excel2002 et WinXP
Dim objWMIService As Object, colInstalledPrinters As Object, objPrinter As Object
Dim nomPC As String, Resultat As String
 
nomPC = "."
 
Set objWMIService = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\" & nomPC & "\root\cimv2")
Set colInstalledPrinters = objWMIService.execQuery("Select * from Win32_Printer")
 
For Each objPrinter In colInstalledPrinters
    Resultat = Resultat & objPrinter.Name & " imprimante active : " & objPrinter.Default & vbLf
Next
 
MsgBox Resultat
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub ProprietesImprimantes()
Dim objWMIService As Object, colItems As Object
Dim objItem As Object
Dim strComputer As String
Dim i As Byte
 
On Error Resume Next
strComputer = "."
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.execQuery("Select * from Win32_printerConfiguration", , 48)
 
For Each objItem In colItems
    i = i + 1
    Cells(1, i) = "bitsPerPel: " & objItem.bitsPerPel
    Cells(2, i) = "Caption: " & objItem.Caption
    Cells(3, i) = "Collate: " & objItem.Collate
    Cells(4, i) = "Color: " & objItem.Color
    Cells(5, i) = "Copies: " & objItem.Copies
    Cells(6, i) = "Description: " & objItem.Description
    Cells(7, i) = "deviceName: " & objItem.deviceName
    Cells(8, i) = "displayFlags: " & objItem.displayFlags
    Cells(9, i) = "displayFrequency: " & objItem.displayFrequency
    Cells(10, i) = "ditherType: " & objItem.ditherType
    Cells(11, i) = "driverVersion: " & objItem.driverVersion
    Cells(12, i) = "Duplex: " & objItem.Duplex
    Cells(13, i) = "formName: " & objItem.formName
    Cells(14, i) = "horizontalResolution: " & objItem.horizontalResolution
    Cells(15, i) = "ICMIntent: " & objItem.ICMIntent
    Cells(16, i) = "ICMMethod: " & objItem.ICMMethod
    Cells(17, i) = "logPixels: " & objItem.logPixels
    Cells(18, i) = "mediaType: " & objItem.mediaType
    Cells(19, i) = "Name: " & objItem.Name
    Cells(20, i) = "Orientation: " & objItem.Orientation
    Cells(21, i) = "paperLength: " & objItem.paperLength
    Cells(22, i) = "paperSize: " & objItem.PaperSize
    Cells(23, i) = "paperWidth: " & objItem.paperWidth
    Cells(24, i) = "pelsHeight: " & objItem.pelsHeight
    Cells(25, i) = "pelsWidth: " & objItem.pelsWidth
    Cells(26, i) = "printQuality: " & objItem.PrintQuality
    Cells(27, i) = "Scale: " & objItem.Scale
    Cells(28, i) = "SettingID: " & objItem.SettingID
    Cells(29, i) = "specificationVersion: " & objItem.specificationVersion
    Cells(30, i) = "TTOption: " & objItem.TTOption
    Cells(31, i) = "verticalResolution: " & objItem.verticalResolution
    Cells(32, i) = "XResolution: " & objItem.Xresolution
    Cells(33, i) = "YResolution: " & objItem.Yresolution
    Columns(i).AutoFit
Next
End Sub




Cette autre adaptation permet de vérifier si l'imprimante est paramétrée pour imprimer en couleur ou en noir et blanc.

Vba
Sélectionnez

Sub verifier_parametre_Couleur_NB_Imprimante_V02()
Dim objWMIService As Object, colItems As Object
Dim objItem As Object
Dim strComputer As String
 
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.execQuery("Select * from Win32_printerConfiguration", , 48)
 
For Each objItem In colItems
    Select Case objItem.Color
    Case 1: MsgBox objItem.Name & " : 'noir et blanc'"
    Case 2: MsgBox objItem.Name & " : 'couleur'"
    End Select
Next
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Option Explicit
 
Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" _
    (ByVal lpDriverName As String, ByVal lpDeviceName As String, _
ByVal lpOutput As Long, ByVal lpInitData As Long) As Long
 
Declare Function GetDeviceCaps Lib "gdi32" _
    (ByVal hdc As Long, ByVal nIndex As Long) As Long
 
 
Const HORZRES = 8
Const VERTRES = 10
Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Const PHYSICALWIDTH = 110
Const PHYSICALHEIGHT = 111
Const PHYSICALOFFSETX = 112
Const PHYSICALOFFSETY = 113
 
 
Sub ProprietesZoneImpressionImprimante()
    'source http://support.microsoft.com/?id=193943
    Dim dpiX As Long, dpiY As Long
    Dim MarginLeft As Long, MarginRight As Long
    Dim MarginTop As Long, MarginBottom As Long
    Dim PrintAreaHorz As Long, PrintAreaVert As Long
    Dim PhysHeight As Long, PhysWidth As Long
    Dim Info As String, Cible As String
    Dim HwndPrint As Long
 
 
    '--- Attention à bien indiquer le nom de l'imprimante avant de lancer la macro ---
    '
    Cible = "hp deskjet 940c" 'Nom de l'imprimante
    '
    '
 
    HwndPrint = CreateDC(0, Cible, 0, 0)
 
    dpiX = GetDeviceCaps(HwndPrint, LOGPIXELSX)
    Info = "Pixels X: " & dpiX & " dpi"
 
    dpiY = GetDeviceCaps(HwndPrint, LOGPIXELSY)
    Info = Info & vbCrLf & "Pixels Y: " & dpiY & " dpi"
 
    MarginLeft = GetDeviceCaps(HwndPrint, PHYSICALOFFSETX)
    Info = Info & vbCrLf & "Unprintable space on left: " & _
    MarginLeft & " pixels (" & Format(MarginLeft / dpiX, "0.000") & " inches)"
 
    MarginTop = GetDeviceCaps(HwndPrint, PHYSICALOFFSETY)
    Info = Info & vbCrLf & "Unprintable space on top: " & _
    MarginTop & " pixels (" & Format(MarginTop / dpiY, "0.000") & " inches)"
 
    PrintAreaHorz = GetDeviceCaps(HwndPrint, HORZRES)
    Info = Info & vbCrLf & "Printable space (Horizontal): " & _
    PrintAreaHorz & " pixels (" & Format(PrintAreaHorz / dpiX, "0.000") & " inches)"
 
    PrintAreaVert = GetDeviceCaps(HwndPrint, VERTRES)
    Info = Info & vbCrLf & "Printable space (Vertical): " & _
    PrintAreaVert & " pixels (" & Format(PrintAreaVert / dpiY, "0.000") & " inches)"
 
    PhysWidth = GetDeviceCaps(HwndPrint, PHYSICALWIDTH)
    Info = Info & vbCrLf & "Total space (Horizontal): " & _
    PhysWidth & " pixels (" & Format(PhysWidth / dpiX, "0.000") & " inches)"
 
    MarginRight = PhysWidth - PrintAreaHorz - MarginLeft
    Info = Info & vbCrLf & "Unprintable space on right: " & _
    MarginRight & " pixels (" & Format(MarginRight / dpiX, "0.000") & " inches)"
 
    PhysHeight = GetDeviceCaps(HwndPrint, PHYSICALHEIGHT)
    Info = Info & vbCrLf & "Total space (Vertical): " & _
    PhysHeight & " pixels (" & Format(PhysHeight / dpiY, "0.000") & " inches)"
 
    MarginBottom = PhysHeight - PrintAreaVert - MarginTop
    Info = Info & vbCrLf & "Unprintable space on bottom: " & _
    MarginBottom & " pixels (" & Format(MarginBottom / dpiY, "0.000") & " inches)"
 
    MsgBox Info, , "Information"
 
End Sub
Créé le 14 mai 2007  par SilkyRoad

Cet exemple modifie la zone d'impression et les marges dans la feuille.

Vba
Sélectionnez

Sub miseEnPageAvantImpression()
    With Feuil1.PageSetup
        'Définit la zone d'impression pour une plage de cellules.
        .PrintArea = "$A$1:$E$10"
        'Mise en page: définit les marges
        .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.75)
        .TopMargin = Application.InchesToPoints(1.5)
        .BottomMargin = Application.InchesToPoints(1)
        .HeaderMargin = Application.InchesToPoints(0.5)
        .FooterMargin = Application.InchesToPoints(0.5)
    End With
 
    Feuil1.PrintPreview
End Sub




Il est aussi possible d'adapter la zone d'impression à une seule feuille pour une économie de papier:

Vba
Sélectionnez

With Feuil1.PageSetup
    .PrintArea = "A1:M100"
    .Zoom = False
    .FitToPagesWide = 1
    .FitToPagesTall = 1
End With




Vous pouvez réinitialiser la zone d'impression à la feuille complète ainsi:

Vba
Sélectionnez

Feuil1.PageSetup.PrintArea = ""



Une autre solution:

Vba
Sélectionnez

Feuil1.PageSetup.PrintArea = False




Pour centrer le contenu de la feuille lors de l'impression, utilisez:

Vba
Sélectionnez

With Feuil1
    .PageSetup.CenterHorizontally = True
    .PageSetup.CenterVertically = True
    .PrintOut
End With




Ce dernier exemple comment imprimer la première page en mode Paysage et la deuxième page en mode Portrait.

Vba
Sélectionnez

With Feuil1
    .PageSetup.Orientation = xlLandscape
    .PrintOut From:=1, To:=1
    .PageSetup.Orientation = xlPortrait
    .PrintOut From:=2, To:=2
End With
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Shell "notepad.exe /P""C:\monRepertoire\leFichier.txt""", 1
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub imprimerTexte()
    Open "LPT1:" For Output As #1
        Print #1, "Test d'impression."
        Print #1, "Test 2eme ligne."
    Close #1
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Private Sub CommandButton1_Click()
    Me.PrintForm
End Sub



L'image du UserForm est automatiquement placée dans le coin supérieur gauche de la page imprimée.


Il n'existe pas d'option pour centrer ou repositionner l'impression. La seule solution palliative consiste à faire une copie d'écran de la boîte de dialogue. Ensuite vous faites un collage dans la feuille de calcul en tant qu'image, pour la manipuler à votre guise.

Cet exemple imprime l'UserForm centré dans la page:

Vba
Sélectionnez

Option Explicit
 
Private Declare Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long)
 
Private Sub CommandButton1_Click()
    Dim Ws As Worksheet
 
    'Copie d'écran de la forme active
    keybd_event vbKeySnapshot, 1, 0&, 0&
    DoEvents
 
    'Ajoute une feuille pour coller l'image de la forme
    Set Ws = Sheets.Add
    Ws.Paste
 
    'impression centrée dans la page
    With Ws
        .PageSetup.CenterHorizontally = True
        .PageSetup.CenterVertically = True
        .PrintOut
    End With
End Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Private Sub CommandButton1_Click()
    Me.Hide
    'Aperçu avant impression de la Feuil1
    Feuil1.PrintPreview
    Me.Show
End Sub
Créé le 14 mai 2007  par SilkyRoad

Lorsque vous imprimez un onglet dont les données se suivent sur plusieurs pages verticales, il est possible de répéter l'impression des premières lignes d'entête dans chaque page. Cela facilite ensuite la relecture du document.

Si par exemple vous souhaitez répéter l'impression des 4 premières lignes dans chaque page:
Menu Fichier
Mise en page
Onglet "Feuille"
Dans le champ "Lignes à répéter en haut", Sélectionnez les 4 lignes qui devront apparaître sur chaque page imprimée.
Vous pouvez aussi saisir directement $1:$4 dans ce champ.
Cliquez sur le bouton OK pour valider.

Cette propriété fonctionne aussi pour répéter l'impression de colonnes.

Créé le 14 mai 2007  par SilkyRoad

Vous pouvez spécifier le nom des feuilles à imprimer dans un tableau Array().

Vba
Sélectionnez

'Imprime une sélection de feuilles ("Feuil1" et "Feuil3")
Worksheets(Array("Feuil1", "Feuil3")).PrintOut
Créé le 14 mai 2007  par SilkyRoad

La gestion de la mise en page de votre feuille pour l'impression passe par l'intermédiaire de la propriété PageSetup. Celle-ci renvoie un objet PageSetup qu'il faut manipuler.
Par exemple:

Vba
Sélectionnez

With objFeuille.PageSetup
    .CenterFooter = "&P"
    .CenterHeader = "&F"
    .FirstPageNumber = 3
    .FitToPagesWide = 1
    .Orientation = xlLandscape
    .PrintGridlines = False
    .PrintHeadings = False
End With
objFeuille.PrintOut 1, 1, 1, False



Ce code imprime la feuille en mettant le nom du fichier dans l'en-tête, le numéro de page dans le pied, celui-ci commençant à 3, force l'impression sur une page en largeur en mode paysage. Ni les lignes, ni les numéros de lignes/colonnes ne seront imprimés.

Créé le 14 février 2004  par Bidou
Vba
Sélectionnez

Option Explicit
Option Base 1
 
 
Sub Test()
    'Worksheets(1) définit la premiere feuille du classeur, à imprimer.
    'Range("C4:F15")définit la plage de cellules à masquer
    MasqueContenuCell_Print Worksheets(1), Range("C4:F15")
End Sub
 
 
Sub MasqueContenuCell_Print(Feuille As Worksheet, Plage As Range)
    Dim FormatInit() As Variant
    Dim Cell As Range
    Dim i As Integer
 
    'Redimesionne le tableau qui va stocker les formats initiaux
    ReDim Preserve FormatInit(Plage.Cells.Count)
 
    'Boucle sur la plage de cellules
    For Each Cell In Plage
        i = i + 1
        FormatInit(i) = Cell.NumberFormat
    Next Cell
 
    'Applique le format ;;; pour masquer le contenu des cellules.
    Plage.NumberFormat = ";;;"
    'Feuille.PrintPreview
    Feuille.PrintOut
 
    i = 0
    'Boucle sur la plage de cellules pour réattibuer les formats initiaux
    For Each Cell In Plage
        i = i + 1
        Cell.NumberFormat = FormatInit(i)
    Next Cell
End Sub
Créé le 20 août 2007  par SilkyRoad

Cette méthode fonctionne aussi pour d'autres formats de fichiers.

Vba
Sélectionnez

Option Explicit
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
    (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String _
    , ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
 
 
Sub ImprimerFichier()
    Dim NomFichier As String
    Dim x As Long
 
    x = FindWindow("XLMAIN", Application.Caption)
    NomFichier = "C:\dossier\rapport.pdf"
 
    ShellExecute x, "print", NomFichier, "", "", 1
End Sub
Créé le 20 août 2007  par SilkyRoad

En utilisant les anciennes fonctions ExecuteExcel4Macro, il est possible d'identifier le nombre total de pages qui seront imprimées dans la feuille active.

Vba
Sélectionnez

MsgBox ExecuteExcel4Macro("GET.DOCUMENT(50)")
Créé le 5 décembre 2007  par SilkyRoad

Cette solution, par macro, personnalise le pied de page central et lance l'impression.
La première page va contenir le texte ""Pied de page 1"". Les autres pages contiendront le texte "Pieds de Pages suivants".

Vba
Sélectionnez

With Feuil1
    .PageSetup.CenterFooter = "Pied de page 1"
    .PrintOut From:=1, To:=1 ', preview:=True
 
    .PageSetup.CenterFooter = "Pieds de Pages suivants"
    .PrintOut From:=2, To:=ExecuteExcel4Macro("GET.DOCUMENT(50)") ', preview:=True
End With
Créé le 5 décembre 2007  par SilkyRoad

Saisissez le symbole deux fois pour que celui-ci soit visible dans l'en-tête ou le pied de page:

Nitro && Glycérine.

Créé le 19 février 2008  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.