Comment convertir Excel en PDF en utilisant VBA

*Ceci est un article d’invité de Ryan Wells, un collègue blogueur et un brillant développeur VBA.*

Si vous travaillez avec Excel, on vous a sans doute demandé de créer des résumés de votre travail.

Rapports de vente, factures, prévisions, calendriers, vous l’appelez.

Vous savez ce que tous ces documents ont en commun ? Ils ont fière allure sous forme de PDF. Vous savez quoi d’autre ? La direction adore les PDF !

Convertir Excel en PDF

Dans ce tutoriel, je vais vous montrer comment utiliser Excel VBA pour convertir toutes sortes d’objets Excel en PDF :

Je vais présenter chacune des macros avec quelques commentaires. De cette façon, vous pourrez les trouver rapidement, les copier dans votre éditeur VBA et les utiliser.

Lorsque vous exécutez l’une de ces macros, une boîte de dialogue Enregistrer sous apparaîtra vous demandant où vous souhaitez enregistrer votre PDF. Le nom par défaut inclut la date et l’horodatage lorsque vous avez exécuté la macro au format aaaammjj_hhmmss.

convertir-excel-en-pdf-save-as-dialog-box

Allons droit au but.

Voici les macros :

Imprimer la sélection au format PDF

Celle là, c’est ma favorite personnellement. Cette macro convertira les cellules que vous avez activement sélectionnées en un PDF.

Si vous n’avez sélectionné qu’une seule cellule, la macro VBA est suffisamment intelligente pour réaliser que vous ne voulez probablement pas convertir une seule cellule, elle vous demande donc de sélectionner la plage que vous souhaitez convertir :

Convertir Excel en PDF sélection d'une plage

Sub PrintSelectionToPDF()
'SUBROUTINE: PrintSelectionToPDF
'DEVELOPER: Ryan Wells
'DESCRIPTION: Print your currently selected range to a PDF

Dim ThisRng As Range
Dim strfile As String
Dim myfile As Variant

If Selection.Count = 1 Then
Set ThisRng = Application.InputBox("Select a range", "Get Range", Type:=8)
Else
Set ThisRng = Selection
End If
'Prompt for save location
strfile = "Selection" & "_" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
strfile = ThisWorkbook.Path & "" & strfile

myfile = Application.GetSaveAsFilename _
(InitialFileName:=strfile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and File Name to Save as PDF")

If myfile <> "False" Then 'save as PDF
ThisRng.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
myfile, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
Else
MsgBox "No File Selected. PDF will not be saved", vbOKOnly, "No File Selected"
End If

End Sub

Une fois que vous avez sélectionné la plage et cliqué sur OK, une boîte de dialogue s’affichera dans laquelle vous pourrez sélectionner l’emplacement où vous souhaitez enregistrer le PDF.

Il choisira automatiquement la date et l’heure de l’horloge de votre système et l’ajoutera au nom du fichier.

Imprimer un tableau au format PDF

De nombreux utilisateurs expérimentés d’Excel stockent leurs données dans des tableaux organisés. En fait, Sumit Bansal lui-même aime tellement les tableaux Excel qu’il les appelle un trésor caché dans Excel.

Cette macro imprime un tableau de votre choix au format PDF. Lorsque vous exécutez la macro, elle vous demandera le nom de la table que vous souhaitez enregistrer.

Convertir Excel en tableau d'impression PDF

Sub PrintTableToPDF()
'SUBROUTINE: PrintTableToPDF
'DEVELOPER: Ryan Wells
'DESCRIPTION: Print a table of your choosing to a PDF

Dim strfile As String
Dim myfile As Variant
Dim strTable As String, r As Range
Application.ScreenUpdating = False

'Enter the table name you want to save
strTable = InputBox("What's the name of the table you want to save?", "Enter Table Name") 'Table you want to save
If Trim(strTable) = "" Then Exit Sub
'Prompt for save location
strfile = strTable & "_" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
strfile = ThisWorkbook.Path & "" & strfile

myfile = Application.GetSaveAsFilename _
(InitialFileName:=strfile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and File Name to Save as PDF")

If myfile <> "False" Then 'save as PDF
Range(strTable).ExportAsFixedFormat Type:=xlTypePDF, Filename:=myfile, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
Else
MsgBox "No File Selected. PDF will not be saved", vbOKOnly, "No File Selected"
End If

Application.DisplayAlerts = False

LetsContinue:
With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
Exit Sub
End Sub

Une fois que vous avez entré le nom du tableau et cliqué sur OK, une boîte de dialogue s’affichera dans laquelle vous pourrez sélectionner l’emplacement où vous souhaitez enregistrer le PDF.

Il choisira automatiquement la date et l’heure de l’horloge de votre système et l’ajoutera au nom du fichier.

Imprimer tous les tableaux dans des PDF séparés

Si votre feuille de calcul comporte plusieurs tableaux et que vous devez enregistrer chacun d’eux dans un fichier PDF distinct, vous pouvez exécuter ce code VBA.

Lorsque vous exécutez cette macro, une boîte de dialogue apparaît vous demandant de sélectionner le dossier dans lequel vous souhaitez enregistrer vos fichiers PDF.

Convertir Excel en dossier de sélection PDF

Une fois que vous avez choisi votre dossier, la macro enregistrera chaque tableau dans un PDF avec le nom du tableau apparaissant de manière pratique dans le titre du PDF.

Sub PrintAllTablesToPDFs()
'SUBROUTINE: PrintAllTablesToPDFs
'DEVELOPER: Ryan Wells
'DESCRIPTION: Print each table in your spreadsheet to a different PDF
Dim strTables() As String
Dim strfile As String
Dim ch As Object, sh As Worksheet
Dim icount As Integer
Dim myfile As Variant
Dim tbl As ListObject
Dim sht As Worksheet

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Where do you want to save your PDF?"
.ButtonName = "Save Here"
.InitialFileName = ThisWorkbook.Path
If .Show = -1 Then ' if OK is pressed
sfolder = .SelectedItems(1)
Else
End
End If
End With

For Each sht In ThisWorkbook.Worksheets
For Each tbl In sht.ListObjects
myfile = ThisWorkbook.Name & "" & tbl.Name & "" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
myfile = sfolder & "" & myfile
sht.Range(tbl.Name).ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
myfile, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
Next tbl
Next sht

End Sub

Imprimer toutes les feuilles dans un seul PDF

Je ne sais pas pour vous, mais dans mon travail, nous devons conserver des copies PDF de presque toutes nos feuilles de calcul. Nous joignons les copies PDF de nos feuilles de calcul à nos calculs de conception. Ces fichiers PDF étaient auparavant convertis en microfiches et sauvegardés pour une conservation à long terme. Vous savez, au cas où l’apocalypse se produirait.

Si vous vous trouvez dans une situation similaire, il est agréable de pouvoir convertir automatiquement toutes les feuilles de votre feuille de calcul en un seul PDF. Voici une macro VBA qui fera exactement cela :

Sub PrintAllSheetsToPDF()
'SUBROUTINE: PrintAllSheetsToPDF
'DEVELOPER: Ryan Wells
'DESCRIPTION: Combine all your worksheets into one PDF
Dim strSheets() As String
Dim strfile As String
Dim sh As Worksheet
Dim icount As Integer
Dim myfile As Variant

'Save Chart Sheet names to an Array
For Each sh In ActiveWorkbook.Worksheets
If sh.Visible = xlSheetVisible Then
ReDim Preserve strSheets(icount)
strSheets(icount) = sh.Name
icount = icount + 1
End If
Next sh

If icount = 0 Then 'No charts found. Punch error
MsgBox "A PDF cannot be created because no sheets were found.", , "No Sheets Found"
Exit Sub
End If

'Prompt for save location
strfile = "Sheets" & "_" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
strfile = ThisWorkbook.Path & "" & strfile

myfile = Application.GetSaveAsFilename _
(InitialFileName:=strfile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and File Name to Save as PDF")

If myfile <> "False" Then 'save as PDF
ThisWorkbook.Sheets(strSheets).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
myfile, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
Else
MsgBox "No File Selected. PDF will not be saved", vbOKOnly, "No File Selected"
End If

End Sub

Imprimer des feuilles de graphiques au format PDF

Cette macro convertit toutes vos feuilles de graphique en un seul PDF, mais pas vos objets de graphique ! Par feuilles de graphique, j’entends les graphiques qui ont leur propre onglet dans votre liste d’onglets de feuille de calcul :

convertir-excel-en-pdf-chart-sheets

Sub PrintChartSheetsToPDF()
'SUBROUTINE: PrintChartSheetsToPDF
'DEVELOPER: Ryan Wells
'DESCRIPTION: Combine all chart sheets into one PDF

Dim strSheets() As String
Dim strfile As String
Dim ch As Object, sh As Worksheet
Dim icount As Integer
Dim myfile As Variant

'Save Chart Sheet names to an Array
For Each ch In ActiveWorkbook.Charts
ReDim Preserve strSheets(icount)
strSheets(icount) = ch.Name
icount = icount + 1
Next ch

If icount = 0 Then 'No charts found. Punch error
MsgBox "A PDF cannot be created because no Chart Sheets were found.", , "No Chart Sheets Found"
Exit Sub
End If

'Prompt for save location
strfile = "Charts" & "_" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
strfile = ThisWorkbook.Path & "" & strfile

myfile = Application.GetSaveAsFilename _
(InitialFileName:=strfile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and File Name to Save as PDF")

If myfile <> "False" Then 'save as PDF
ThisWorkbook.Sheets(strSheets).Select

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
myfile, Quality:=xlQualityStandard, IncludeDocProperties:=True, _
IgnorePrintAreas:=False, OpenAfterPublish:=True
Else
MsgBox "No File Selected. PDF will not be saved", vbOKOnly, "No File Selected"
End If

End Sub

Imprimer les objets du graphique au format PDF

Cette macro enregistre tous vos graphiques normaux (objets graphiques) dans un seul PDF. Quelle que soit la feuille de calcul sur laquelle se trouve votre graphique, il sera récupéré et enregistré au format PDF.

Il n’y aura qu’un seul graphique par page dans le PDF final.

Sub PrintChartsObjectsToPDF()
'SUBROUTINE: PrintChartsObjectsToPDF
'DEVELOPER: Ryan Wells
'DESCRIPTION: Combine all chart objects into one PDF

Dim ws As Worksheet, wsTemp As Worksheet
Dim chrt As ChartObject
Dim tp As Long
Dim strfile As String
Dim myfile As Variant

Application.ScreenUpdating = False

Set wsTemp = Sheets.Add

tp = 10

With wsTemp
For Each ws In ActiveWorkbook.Worksheets
If ws.Name = wsTemp.Name Then GoTo nextws:
For Each chrt In ws.ChartObjects
chrt.Copy
wsTemp.Range("A1").PasteSpecial
Selection.Top = tp
Selection.Left = 5
If Selection.TopLeftCell.Row > 1 Then
ActiveSheet.Rows(Selection.TopLeftCell.Row).PageBreak = xlPageBreakManual
End If
tp = tp + Selection.Height + 50
Next
nextws:
Next ws
End With

'Prompt for save location
strfile = "Charts" & "_" _
& Format(Now(), "yyyymmdd_hhmmss") _
& ".pdf"
strfile = ActiveWorkbook.Path & "" & strfile

myfile = Application.GetSaveAsFilename _
(InitialFileName:=strfile, _
FileFilter:="PDF Files (*.pdf), *.pdf", _
Title:="Select Folder and File Name to Save as PDF")

If myfile <> False Then 'save as PDF
wsTemp.ExportAsFixedFormat Type:=xlTypePDF, Filename:=myfile, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
'Else
' MsgBox "No File Selected. PDF will not be saved", vbOKOnly, "No File Selected"
End If

Application.DisplayAlerts = False
wsTemp.Delete

With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With
Exit Sub
End Sub

Si vous avez des questions, déposez-les dans la section commentaires, où Ryan et moi vous y attendrons.

Vous aimerez peut-être aussi les didacticiels Excel suivants :

A propos de l’auteur: Ryan Wells est ingénieur nucléaire et développeur VBA professionnel. Il publie ses didacticiels Excel VBA faciles à comprendre pour aider les autres à écrire de meilleures macros. En plus d’enseigner VBA, Ryan est le développeur principal de plusieurs Compléments Excel. Vous pouvez retrouver ses tutos sur WellsR.com.