Excel +VBA + PDF & Sendkeys

Trois Pierres

Nouveau membre
Bonjour à tous,
à force de fouiner sur différents forums, je pensais avoir trouvé la solution magique à mon problème, qui me semble récurrent :
Au moyen d'une macro VBA, créer un fichier pdf à partir d'une feuille Excel, et l'enregistrer dans un répertoire et sous un nom créés dans la macro, sans intervention de l'utilisateur (au niveau de la boîte de dialogue "Enregistrer sous..").

Voici le code que j'ai écrit (en me basant sur celui que j'ai trouvé ici et là) :

[cpp]Sub PrintPDF()
Dim Path As String, File As String, Chaine As String
' Ceci à titre d'exemple. Le nom et le chemin sont normalement créés par la macro
Path = "C:\Facture\"
File = "toto.pdf"
Chaine = Path & File
DoEvents
Application.SendKeys Keys:=Chaine + "~", Wait:=True
ActiveSheet.PrintOut ActivePrinter:="Adobe PDF", Copies:=1, Collate:=True
End Sub
[/cpp]
La pseudo "impression" sur Adobe PDF fonctionne sans problème, mais l'envoi des données par Sendkeys ne donne aucun résultat.
- si je supprime l'ordre d'impression, la "chaine" est bien envoyée dans la cellule active de ma feuille.
- si j'écris une macro sembable pour créer un fichier texte, pas de problème.

Mais rien à faire avec le "dialogue" d'impression ! A se demander où partent les caractères envoyés...
J'ai eu beau placer des "DoEvents" ou ajouter des "{ENTER}", rien ne marche.

Je pense n'être pas le seul à avoir le problème, et j'espère que ceratins l'ont résolu.
Merci d'avance pour votre aide,
Trois Pierres

(Environnement WinXP Fam, Office 2003)

Message modifié le 08/02/08 pour respecter les règles...
 

kiki29

Habitué
Si tu as Acrobat Distiller
Code:
'------------------------------------------------------------
'
'   sous VBE Menu Outils | Références
'   Cocher Acrobat Distiller
'
'------------------------------------------------------------

Option Explicit

Sub Tst_Adobe_PDF()
Dim sNomFichierPS As String
Dim sNomFichierPDF As String
Dim sNomFichierLOG As String
Dim PDFDist As PdfDistiller
Dim PrinterDefault As String
 
    '   Sur un PC "Personnel" : a priori choix libre du Nom
    '   et de l'emplacement du fichier de sortie, on est logué en
    '   Administrateur sur son PC
    '
    '   Sur un PC "Entreprise" :
    '   Il faut être logué en Administrateur ou en
    '   Avoir les droits pour utiliser Distiller
    '   Les chemins PS PDF LOG devront être de la forme :
    '       "C:\Documents and Settings\UserName\.....\....."
     
    PrinterDefault = Application.ActivePrinter
    Application.ActivePrinter = Imprimante_AdobePDF
   
    ' Ici le cas d'un PC "Personnel"
    sNomFichierPS = ThisWorkbook.Path & "\" & "Essai_AdobbePDF.ps"
    sNomFichierPDF = ThisWorkbook.Path & "\" & "Essai_AdobbePDF.pdf"
    sNomFichierLOG = ThisWorkbook.Path & "\" & "Essai_AdobbePDF.log"
 
    '   Impression d'une zone nommée
    ActiveSheet.Range("Zone").PrintOut Copies:=1, Preview:=False, _
                                       ActivePrinter:=Imprimante_AdobePDF, PrintToFile:=True, _
                                       Collate:=True, PrToFilename:=sNomFichierPS
 
    Set PDFDist = New PdfDistiller
    PDFDist.FileToPDF sNomFichierPS, sNomFichierPDF, ""
    Set PDFDist = Nothing
 
    Kill sNomFichierPS
    Kill sNomFichierLOG
 
    Application.ActivePrinter = PrinterDefault
End Sub

'       Si l 'on a plusieurs imprimantes il faut :
'           Sélectionner l 'imprimante virtuelle Adobe PDF tout en conservant
'               trace de l'imprimante utilisée par défaut
'       Le N° de port réseau NeXY varie suivant le PC sur lequel la macro tourne
Private Function Imprimante_AdobePDF() As String
Dim i As Integer
Dim NomPortReseau As String
    ' 11 imprimantes réseau
    For i = 0 To 10
        If i < 10 Then
            NomPortReseau = "Adobe PDF sur Ne0" & i & ":"
        Else
            NomPortReseau = "Adobe PDF sur Ne" & i & ":"
        End If
        On Error Resume Next
        Application.ActivePrinter = NomPortReseau
        If ActivePrinter = NomPortReseau Then
            Exit For
        End If
    Next i
    Imprimante_AdobePDF = NomPortReseau
End Function


'   Sur PC "Entreprise"
'Dim sUserProfile As String
'    sUserProfile = Environ("USERPROFILE")
'
'    sNomFichierPS = sUserProfile & "\" & "Essai_AdobbePDF.ps"
'    sNomFichierPDF = sUserProfile & "\" & "Essai_AdobbePDF.pdf"
'    sNomFichierLOG = sUserProfile & "\" & "Essai_AdobbePDF.log"
 

Trois Pierres

Nouveau membre
Merci à Kiki29 pour cette réponse et le code fourni.

Voilà une solution complète et fiable qui fonctionne parfaitement.
En plus, cela m'a permis d'apprendre des nouveautés en VBA (et Dieu sait que j'en ai besoin!).

Petite question cependant : où est documenté tout ce qui concerne les commandes relatives à Distiller, notament dans les lignes :
[cpp]Set PDFDist = New PdfDistiller
PDFDist.FileToPDF sNomFichierPS, sNomFichierPDF, ""
Set PDFDist = Nothing
[/cpp] ou
[cpp]Dim PDFDist As PdfDistiller[/cpp]
Je n'ai pas trouvé... mais peut-être mal cherché.
Merci encore, Trois Pierres
 

zeb

Modérateur
Tout ce qui concerne les commandes relatives à Distiller est à chercher chez l'éditeur, pas dans VB bien sûr.
 
M

Membre supprimé 1

Invité
C'est super car je regarde le même type d'appli. Je bute sur une déclaration à la ligne suivante :
Dim PDFDist As PdfDistiller
c'est certainement un pb de déclaration...

-----
par ailleurs j'avais utilisé ce bout de code avec succès :
Sub ImprimerPDF()

Sheets("Feuil1").Select
ThePath = "K:\Tempo\"
TheFile = "testpdf2.PDF"
SendKeys ThePath & TheFile + "~"
SendKeys ("{ENTER}")

ActiveWindow.SelectedSheets.PrintOut copies:=1, ActivePrinter:="Adobe PDF"
End Sub

qui marche bien mais le pdf s'ouvre dans acrobat et je n'arrive pas à le fermer automatiquement par des sendkeys pour passer à la suite de mon appli vba.

Savez vous m'aider. Merci
 

KangOl

Grand Maître
merci de respecter les règles de mise en page et d'utiliser la balise
Code:
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 078
Membres
1 586 395
Dernier membre
franckorus
Partager cette page
Haut