Excel : Générer PDF en VBA

Joe[PT]

XLDnaute Junior
Bonsoir à tous,

Je suis en train d'essayer de générer un PDF d'une zone de la page.

Avec le code suivant, j'arrive à générer un Pdf qui s'enregistre bien avec le nom voulu et sur le bureau.

Code:
Sub DMI_Générer_PDF()
    Dim sRep As String                  ' Répertoire de sauvegarde
    Dim sFilename As String             ' Nom du fichier
   
    sRep = "C:\Users\Joe\Desktop\"                       ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
    sFilename = "Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("B20") & "." & "pdf"      ' Nom du fichier
    
    Range("A15:H54").Select
    ActiveSheets.ExportAsFixedFormat Type:=xlTypePDF, Filename:=sRep & sFilename, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
End Sub

Malheureusement, je ne trouve pas la syntaxe exacte pour sélectionner uniquement la zone (A15:H54) que je veux sauvegarder dans le fichier .pdf... Je ne vois pas ce qui cloche. J'ai remplacé "ActiveSheets.Export... par "ActiveCells.Export..." mais ça ne change rien.

On verra bien demain matin,

Bonne nuit.

Joe
 

Tentative

XLDnaute Occasionnel
Re : Excel : Générer PDF en VBA

Bonjour,

Mes connaissances en Vba sont très limitées.

Perso, pour faire un fichier .pdf avec une plage, j'imprime la plage en pdf.
J'avoue n'avoir jamais automatisé cette tâche.

Je suis curieux, je vais suivre ce fil.


Tentative
 

Modeste geedee

XLDnaute Barbatruc
Re : Excel : Générer PDF en VBA

Bonsour®

:rolleyes:
plutôt que ActiveSheet ,
simplement
imprimer la sélection !!! ... :eek:

VB:
sRep = "C:\Users\Joe\Desktop\"                       ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
sFilename = "Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("B20") & "." & "pdf"      ' Nom du fichier
        
Range("A15:H54").Select
Selection.ExportAsFixedFormat _
                     Type:=xlTypePDF, _
                     Filename:=sRep & sFilename, _
                     Quality:=xlQualityStandard, _
                     IncludeDocProperties:=True, _
                     IgnorePrintAreas:=False, _
                     OpenAfterPublish:=True
 

Joe[PT]

XLDnaute Junior
Re : Excel : Générer PDF en VBA

Bonjour Tentative, Modeste Geedee, le Forum,

Merci Modeste Geedee, ça fonctionne nickel.

Un souci toutefois, si le .pdf est déjà enregistré dans le répertoire, je ne veux pas qu'il l'écrase (au risque d'écraser un fichier existant). Alors, j'ai commencé à "bricoler" un bout de code mais ça bug... :( et le non-codeur que je suis sèche un peu... beaucoup!

Code:
Sub DMI_Générer_PDF()
' Permet de générer une impression PDF d'une partie d'une feuille
' en sauvegardant le document .pdf avec un nom spécifique et dans répertoire déterminé

    Dim sRep As String                  ' Répertoire de sauvegarde
    Dim sFilename As String             ' Nom du fichier
    
    sRep = "C:\Users\Joe\Desktop\"                       ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
    sFilename = "Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("C20") & "." & "pdf"      ' Nom du fichier
    
        ' Vérifier si un fichier portant ce nom existe
        If sRep("Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("C20").Value & "." & "pdf") = "" Then
             If MsgBox("Un fichier ayant ce nom " & sFilename & " existe " & _
                "déjà dans ce répertoire " & sRep & "." & vbCrLf & _
                "Désirez-vous l'écraser ? ", vbCritical + vbYesNo, "Attention !") = vbNo Then
                 sFilename = Application.InputBox("Donner lui un nouveau nom.")
                 If Format(sFilename) = False Then
                      MsgBox "Opération de la Création des fichiers PDF annulée."
                 Else
             End If
         End If
    End If
    
    Esle
    Range("A15:H54").Select
    Selection.ExportAsFixedFormat _
                     Type:=xlTypePDF, _
                     Filename:=sRep & sFilename, _
                     Quality:=xlQualityStandard, _
                     IncludeDocProperties:=True, _
                     IgnorePrintAreas:=False, _
                     OpenAfterPublish:=True
    End If
    
End Sub

La macro s'arrête sur sRep avec le message "Tableau Attendu"... Heu !

Bonne journée.

Joe
 
Dernière édition:

Joe[PT]

XLDnaute Junior
Re : Excel : Générer PDF en VBA

Bonjour Geedee & Tentative, bonjour le forum,

Après (grosse) réflexion, j'ai adapté un bout de code trouvé sur un forum et que j'ai réussi à faire fonctionner en partie :
- pdf enregistré au bon endroit avec le bon nom
- message d'erreur ok si fichier existe déjà dans le répertoire
- plage A15:H54 de la Feuil1 imprimée

Lorsque j'essaie d'y ajouter la 2e plage de la Feuil2 = Je plante tout !

Voici le code que j'ai à l'heure actuelle et qui fonctionne en partie (j'ai volontairement supprimé la 2e plage) pour pouvoir m'en servir même si ce n'est pas exactement ce que je recherche.

Code:
Sub DMI_Générer_PDF()
' Permet de générer une impression PDF d'une partie d'une feuille
' en sauvegardant le document .pdf avec un nom spécifique et dans répertoire déterminé

    Dim sRep As String                  ' Répertoire de sauvegarde
    Dim sFilename As String             ' Nom du fichier
    
    sRep = "C:\Users\Joe\Desktop\"                       ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
    sFilename = "Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("C20") & "." & "pdf"      ' Nom du fichier
    
        ' Vérifier si un fichier portant ce nom existe
        If sRep = ("Douanes" & "-" & ActiveSheet.Name & "-" & Range("B18").Value & "-" & Range("C20").Value & "." & "pdf") <> "" Then
             If MsgBox("Un fichier ayant ce nom " & sFilename & " existe " & _
                "déjà dans ce répertoire " & sRep & "." & vbCrLf & _
                "Désirez-vous l'écraser ? ", vbCritical + vbYesNo, "Attention !") = vbNo Then
                 sFilename = Application.InputBox("Donner lui un nouveau nom.")
                 If Format(sFilename) = False Then
                      MsgBox "Opération de la Création des fichiers PDF annulée."
                 Else
             End If
         End If
    End If
    
' Impression PDF de la feuille "DMI"
    Range("A15:H54").Select
    Selection.ExportAsFixedFormat _
                     Type:=xlTypePDF, _
                     Filename:=sRep & sFilename, _
                     Quality:=xlQualityStandard, _
                     IncludeDocProperties:=True, _
                     IgnorePrintAreas:=False, _
                     OpenAfterPublish:=True
End Sub

Voilà, merci pour votre attention et aide. Je vais continuer à chercher la solution.

Bon week-end,

Joe
 

david84

XLDnaute Barbatruc
Re : Excel : Générer PDF en VBA

Bonjour,
tu peux utiliser la propriété PrintArea pour définir les zones d'impression :
Code:
'on définit les zones d'impression
Worksheets(1).PageSetup.PrintArea = "$A$1:$B$4"
Worksheets(2).PageSetup.PrintArea = "$A$1:$B$5"

'on lance l'export (laisser IgnorePrintAreas:=False et adapter le chemin complet contenu dans sFilename)
ThisWorkbook.ExportAsFixedFormat _
                 Type:=xlTypePDF, _
                 Filename:=sFilename, _
                 Quality:=xlQualityStandard, _
                 IncludeDocProperties:=True, _
                 IgnorePrintAreas:=False, _
                 OpenAfterPublish:=True
                 
'on annule les zones d'impression
Worksheets(1).PageSetup.PrintArea = vbNullString
Worksheets(2).PageSetup.PrintArea = vbNullString
A+
 

Joe[PT]

XLDnaute Junior
Re : Excel : Générer PDF en VBA

Bonjour David et merci pour ton aide,

j'ai apporté les modifications et en fait, quoique je fasse, le PDF imprime tout le classeur et pas seulement les deux plages voulues :

Code:
'on définit les zones d'impression
Worksheets("DMI").PageSetup.PrintArea = "$A$15:$H$54"
Worksheets("DMI Accompagnement").PageSetup.PrintArea = "$A$15:$J$43"

'on lance l'export (laisser IgnorePrintAreas:=False et adapter le chemin complet contenu dans sFilename)
ThisWorkbook.ExportAsFixedFormat _
                 Type:=xlTypePDF, _
                 Filename:=sFilename, _
                 Quality:=xlQualityStandard, _
                 IncludeDocProperties:=True, _
                 IgnorePrintAreas:=False, _
                 OpenAfterPublish:=True
                 
'on annule les zones d'impression
Worksheets("DMI").PageSetup.PrintArea = vbNullString
Worksheets("DMI Accompagnement").PageSetup.PrintArea = vbNullString

Je pense que l'instruction "ThisWorkBook.ExportAs..." reprend le classeur entier malgré tout, non ?

Je continue à regarder ;)
Bon après-midi,
Joe
 

NePasEcraserMonExcel

XLDnaute Nouveau
Re : Excel : Générer PDF en VBA

Ha bizarre alors et comme mon classeur fait plus de 50 feuilles du coup je récupère un fichier PDF qui fait plus de 470 pages :confused:

Je vais regarder ça d'un peu plus près ce soir ;)

Bonne journée.
Joe


Bonjour Joe, merci pour ta question, ça m'aide beaucoup.
en effet, j'ai eu le même problème comme toi, j'ai créé un pdf avec toutes les feuilles.
une petite modification peut nous aider à sortir les zones d'impression qu'on veut :

'on lance l'export (laisser IgnorePrintAreas:=False et adapter le chemin complet contenu dans sFilename)
Worksheets("DMI").ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=sFilename, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
 

kiki29

XLDnaute Barbatruc
VB:
Option Explicit

Sub Tst()
Dim Rng As Range, sNomFichier As String
  Set Rng = Feuil1.Range("c6:h32")
  sNomFichier = "C:\Tests\Classeur1.pdf"
  Rng.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
  sNomFichier, _
  Quality:=xlQualityStandard, _
  IncludeDocProperties:=True, _
  IgnorePrintAreas:=False, _
  OpenAfterPublish:=False
End Sub
 

Bnj

XLDnaute Occasionnel
Bonjour à tout le monde

J'ai essayé le code VBA mais ça beugue.
Je souhaiterais que la macro sauvegarde les deux TCD de la feuille active en PDF (sur le même fichier)

Sub sauvegarde_PAM_original()


sRep = "G:\" ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
sFilename = "sauvegarde_PAM_original" & "-" & ActiveSheet.Name & "-" & Range("B1").Value & "-" & Range("C1") & "." & "pdf" ' Nom du fichier

Range("Tableau croisé dynamique1").Select & Range("Tableau croisé dynamique2").Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=sRep & sFilename, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub
 
Dernière édition:

NePasEcraserMonExcel

XLDnaute Nouveau
Bonjour à tout le monde

J'ai essayé le code VBA mais ça beugue.
Je souhaiterais que la macro sauvegarde les deux TCD de la feuille active en PDF (sur le même fichier)

Sub sauvegarde_PAM_original()


sRep = "G:\" ' Répertoire de sauvegarde (si non spécifié, répertoire actif par défaut)
sFilename = "sauvegarde_PAM_original" & "-" & ActiveSheet.Name & "-" & Range("B1").Value & "-" & Range("C1") & "." & "pdf" ' Nom du fichier

Range("Tableau croisé dynamique1").Select & Range("Tableau croisé dynamique2").Select
Selection.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=sRep & sFilename, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
End Sub

Bonjour,
avant de vous répondre, j'ai quelques questions :
- le sub reconnait-il "ActiveSheet.Name" ?
- avez-vous DIM "Tableau coisé dynamique1" et "Tableau croisé dynamique2" comme Public Variant au début du module ? sinon le problème peut vient d'ici, parce que le code ne connait pas Tableau coisé dynamique1 et Tableau croisé dynamique2
j'ai vu aussi que vous avez mis "Range("B1").Value" mais pas de ".Value" avec Range("C1"), par contre, je ne pense pas que l'erreur vient d'ici...
 

Discussions similaires

Réponses
2
Affichages
203

Statistiques des forums

Discussions
312 107
Messages
2 085 354
Membres
102 873
dernier inscrit
yayo