Convertir un *.doc en *.pdf via VBA

  • Initiateur de la discussion Vincent
  • Date de début
V

Vincent

Guest
Bonjour à tous,

Je suis un peu en galère: je n'arrive pas à convertir un fichier Word en fichier Pdf avec une macro excel. J'ai pas mal cherché sur le net, mais j'ai rien trouvé de satisfaisant.

J'ai Adobe Acrobat 6.

Si quelqu'un pourrait me débloquer rapidemant, ce serait vraiment nice!

Merci
 

MichD

XLDnaute Impliqué
Re : Convertir un *.doc en *.pdf via VBA

J'ai modifié légèrement la procédure, car dans la ligne de code suivante : Cette ligne de code :
Dc.PrintOut copies:=1, ActivePrinter:="PDFCreator"

Comme tu imprimes un document Word, le paramètre "ActivePrinter" n'est pas présent dans Word comme il l'est dans Excel. On doit le définir à partir de cette ligne de code dans Word comme ceci : Wd.ActivePrinter = "PdfCreator" comme dans la procédure "Test" . Le nom "PdfCreator" est celui indiqué dans le panneau de configuration Windows (imprimantes).

De plus, il ne faut pas oublier d'ajouter la référence "Microsoft Word xx Objects Library"
Pour ce faire, dans la fenêtre de l'éditeur de code d'Excel, barre des menus / outils /
références / et tu coches la référence mentionnée dans la liste.

Si tu as un problème, donne-moi l'adresse Web du téléchargement de ta version "PdfCreator",
et je ferai quelques tests sur le sujet.


'API pour déterminer l'imprimante par défaut.
'Dans le haut du module standard

VB:
'-----------------------------------------------------------------------------------------
Private Const ERROR_INSUFFICIENT_BUFFER = 122&
Private Declare Function GetDefaultPrinter Lib "winspool.drv" Alias _
    "GetDefaultPrinterA" (ByVal pszBuffer As String, _
                          ByRef pcchBuffer As Long) As Long
'-----------------------------------------------------------------------------------------
Sub test()

Dim Wd As Word.Application, Dc As Word.document
Dim Chemin As String, Fichier As String
Dim NouveauNom As String, ImprimanteActuel As String

'Répertoire où est le document
Chemin = "c:\Users\MichD\Documents\"
'Nom du document Word
Fichier = "Martine aime martine.docm"

'Vérifie que le fichier existe vraiment dans le répertoire indiqué.
If Dir(Chemin & fichier) = "" Then
    MsgBox "Le fichier """ & fichier & """ indiqué n'existe " & _
    "pas dans ce répertoire " & Chemin & """  .  Vérifier. Procédure annulée.", _
     vbCritical + vbOKOnly, "Attention"
    Exit Sub
End If

'Nouveau nom qu'aura le ficher pdf (test.pdf)
NouveauNom = Left(Fichier, VBA.InStrRev(Fichier, ".") - 1) & ".pdf"

 Application.ScreenUpdating = False
'Création d'un instance Word
Set Wd = CreateObject("Word.Application")

'Désactive l'exécution des macros à l'ouverture du fichier
Wd.AutomationSecurity = msoAutomationSecurityForceDisable

'Ouverture du fichier Word
Set Dc = Wd.documents.Open(Chemin & Fichier)

'Définir l'imprimante active afin de pouvoir la
'remettre à la fin de l'opération
ImprimanteActuel = Nom_Imprimante_Active

'Définir l'imprimante de l'application Word
Wd.ActivePrinter = "PdfCreator"

'Lancer la procédure devant créer le fichier PDF
Call Instancier_PdFCreator(Dc, Chemin, NouveauNom)

'Remettre par défaut l'imprimante du début
Call Définir_Imprimante_Par_défaut(ImprimanteActuel)
 Dc.Close False
 Wd.Quit
'Libère la mémoire des objets
Set Dc = Nothing: Set Wd = Nothing
 Application.ScreenUpdating = True
End Sub

'-----------------------------------------------------------------------------------------
Sub Instancier_PdFCreator(Dc As Word.document, Répertoire As String, _
                                         FichierDest As String)
killtask ("PDFCreator.exe") 'Procédure écrite plus bas...

Set pdfjob = CreateObject("PDFCreator.clsPDFCreator")
'Make sure the PDF printer can start
If pdfjob.cStart("/NoProcessingAtStartup") = False Then
   MsgBox "Imposssible d'initialiser PDFCreator.", vbCritical + _
       vbOKOnly, "Erreur!"
   Exit Sub
End If

'Set all defaults
With pdfjob
    .cOption("UseAutosave") = 1
    .cOption("UseAutosaveDirectory") = 1
    .cOption("AutosaveDirectory") = Répertoire
    .cOption("AutosaveFilename") = FichierDest
    .cOption("AutosaveFormat") = 0  ' 0 = PDF
    .cClearCache
    .cPrinterStop = True
End With

Dc.PrintOut copies:=1

Do Until pdfjob.cCountOfPrintjobs = 1
    DoEvents
Loop

pdfjob.cPrinterStop = False

'Wait until the file shows up before closing PDF Creator
 Do
     DoEvents
Loop Until Dir(Répertoire & FichierDest) = FichierDest

pdfjob.cClose
Set pdfjob = Nothing   
End Sub
'-----------------------------------------------------------------------------------------

Sub killtask(sappname As String)
   Dim oProclist As Object
   Dim oWMI As Object
   Dim oProc As Object
   Set oWMI = GetObject("winmgmts:")
   If IsNull(oWMI) = False Then
       Set oProclist = oWMI.InstancesOf("win32_process")
       For Each oProc In oProclist
           If UCase(oProc.Name) = UCase(sappname) Then
               oProc.Terminate (0)
           End If
       Next oProc
   Else
       MsgBox "Killing """ & sappname & _
       """ - Can't create WMI Object.", _
       vbOKOnly + vbCritical, "CloseAPP_B"
   End If
   Set oProclist = Nothing
   Set oWMI = Nothing
End Sub

'-----------------------------------------------------------------------------------------
Sub Définir_Imprimante_Par_défaut(NomImprimante As String)
 strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colInstalledPrinters = objWMIService.ExecQuery _
     ("Select * from Win32_Printer Where Name = '" & NomImprimante & "'")
For Each objPrinter In colInstalledPrinters
     objPrinter.SetDefaultPrinter
Next
End Sub
'-----------------------------------------------------------------------------------------

Function Nom_Imprimante_Active()
Dim lResult As Long, BufLen As Long
Dim PrinterName As String
 BufLen = 0
' Récupère la taille nécessaire pour le nom
lResult = GetDefaultPrinter(PrinterName, BufLen)
' Alloue le buffer pour le nom
PrinterName = String(BufLen, 0)
 lResult = GetDefaultPrinter(PrinterName, BufLen)
' Supprime le zéro binaire de fin
Nom_Imprimante_Active = Left(PrinterName, InStr(PrinterName, Chr$(0)) - 1)
End Function
'-----------------------------------------------------------------------------------------
 
Dernière édition:

Numidia

XLDnaute Occasionnel
Re : Convertir un *.doc en *.pdf via VBA

Bonjour Tt le monde Bonjour MichD
Oui j'ai bien regardé sur le panneau de configuration de Windows / imprimante / le nom que porte l'imprimante est "PdfCreator"
oui la référence microsoft Word a été activée auparavant voire même la référence Pdfcreator

j'ai changé de Pc le problème signalé restait le même
Bravo MichD , merci infiniment , vous avez réglé une partie importante de ce problème car le nouveau code que venez de me filer fonction très bien l’erreur n'est plus signalée mais par contre il me demande de l'enregistrer quelques part (Fichier en cours de conversion) alors que personnellement je souhaiterais vraisemblablement que ce fichier soit enregistré automatiquement sur le même répertoire que le fichier .docx
le site de téléchargement de pdfcreator 1-7-2 (version que j'utilise) est pdfforge | The free PDF Creator, Converter and PDF Editor
Merci MichD
 

MichD

XLDnaute Impliqué
Re : Convertir un *.doc en *.pdf via VBA

Bonjour,

L'adresse que tu me donnes permet de télécharger la version 2.1 de PDFCreator. Évidemment, ce code n'est pas compatible avec ces nouvelles versions. D'ailleurs, depuis Excel 2007, nous n'avons plus besoin d'avoir recours à ce type de procédure. Comme je suis avec Windows 8.1 et Office 2013, je ne peux pas tester la procédure.

J'ai apporté quelques modifications à la dernière procédure que j'ai publiée. Utilise et teste cette dernière mouture.

Dans la procédure TEST, assure-toi de bien ajouter le "\" à la fin du chemin où tu veux enregistrer ton document.
Comme ceci :

'Répertoire où est le document
Chemin = "c:\Users\MichD\Documents\" '<<<<<<=== Adapte le chemin selon ton environnement.
'Nom du document Word
Fichier = "Martine aime martine.docm" ' Même chose pour le nom de ton fichier Word.

Si cela ne fonctionne toujours pas... Exécute la procédure pas à pas en utilisant la touche F8 et observe la valeur des variables "Répertoire" et "FichierDest" en passant la souris au-dessus des variables lorsque la ligne de code a été exécutée.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Convertir un *.doc en *.pdf via VBA

Bonjour tout le monde,

Pourquoi ne pas travailler directement dans Word ?

Et à partir d'Office 2007 pas besoin de PDFCreator.

Donc dans le document Word ci-joint :

- créer un bouton ActiveX (onglet Développeur-Outils hérités)

- coller ce code dans ThisDocument :

Code:
Private Sub CommandButton1_Click()
Dim NomComplet$
NomComplet = Left(Me.FullName, InStrRev(Me.FullName, ".") - 1)
Application.DisplayAlerts = False
Me.ExportAsFixedFormat NomComplet, wdExportFormatPDF
End Sub
Edit : bien entendu on peut ne pas utiliser de bouton.

Mettre alors le code dans un module standard et remplacer Me par ThisDocument ou ActiveDocument.

A+
 

Pièces jointes

  • MonDoc(1).zip
    18.7 KB · Affichages: 79
Dernière édition:

Discussions similaires

Réponses
8
Affichages
399

Statistiques des forums

Discussions
312 299
Messages
2 086 998
Membres
103 425
dernier inscrit
alainPontonnier