formateur informatique

Convertir tous les PDF d'un dossier en fichiers Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Convertir tous les PDF d'un dossier en fichiers Word
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Convertir tous les PDF d'un dossier

Lors des deux volets précédents, nous avons vu d'une part comment convertir un fichier PDF au format Word et d'autre part comment parcourir tous les fichiers d'un dossier. Avec cette nouvelle astuce VBA Word, nous proposons d'assembler ces deux techniques. L'objectif est de procéder à la conversion de masse de tous les fichiers PDF contenus dans un dossier défini par l'utilisateur à l'aide d'une boîte de dialogue.

Sources de travail
Pour produire cette solution, nous proposons de nous appuyer sur des sources offrant notamment des fichiers PDF à convertir mais aussi un UserForm VBA Word à importer dans le projet. Comme vous pouvez le voir, la décompression livre tout d'abord neuf fichiers PDF. Il s'agit de petits supports de formation à Excel pour débutants. Mais ce n'est pas tout, vous notez aussi la présence d'un document Word avec l'extension docm pour la prise en charge des macros. Enfin le formulaire à importer est scindé en deux fichiers. Celui portant l'extension frm représente l'interface graphique tandis que le frx représente le code VBA associé.

Importer le userForm dans le projet VBA
Pour débuter, nous proposons de poser le socle de l'application à finaliser. Et pour cela, nous devons commencer par importer le formulaire dans le projet VBA Word.
  • A la racine du dossier de décompression double cliquer sur le fichier convertirTousPDF.docm,
  • Dès lors, cliquer sur le bouton Activer la modification du bandeau de sécurité,
Comme vous pouvez le voir, il s'agit d'un document vierge mais qui prend en charge les macros comme nous l'avons dit.
  • Maintenant, réaliser le raccourci clavier ALT + F11,
Ainsi, nous basculons dans l'éditeur VBA Word.
  • Dans l'explorateur de projet sur la gauche, cliquer droit sur l'élément ThisDocument,
  • Dans le menu contextuel, choisir la commande Importer un fichier,
  • Avec la boîte de dialogue qui suit, pointer sur le dossier de décompression des sources,
  • Puis, double cliquer sur le fichier convertirTousPDF.frm pour importer le userForm,
Un nouveau dossier apparaît dans l'arborescence. Il est nommé feuilles. C'est lui qui héberge les formulaires graphiques.
  • Double cliquer sur ce dernier pour afficher son contenu,
  • Puis, double cliquer sur l'élément convertirTousPDF qu'il contient,
Nous affichons ainsi le formulaire graphique au centre de l'écran. Il est doté de trois boutons. Les deux plus gros sont placés en bas de l'interface. Le premier doit permettre de lancer la conversion de masse. Le second permet déjà de fermer le formulaire. Le troisième bouton est situé en haut et à droite de la zone de saisie. Il est matérialisé par l'icône d'un petit dossier.

Formulaire graphique VBA pour convertir tous les fichiers PDF du dossier désigné au format Word

Ce bouton porte le nom Parcourir.
  • Sur le formulaire en conception, double cliquer sur ce bouton à l'icône du dossier,
Nous basculons ainsi dans le code Visual Basic Word entre les bornes de la procédure événementielle Parcourir_Click. Comme vous pouvez le voir, le code associé au clic sur ce bouton existe déjà. En effet, nous l'avons démontré lors de l'astuce précédente. Il consiste à récolter le chemin du dossier désigné par l'utilisateur par le biais d'une boîte de dialogue standard d'Office. C'est ce dossier que nous devrons parcourir pour entamer la conversion de masse des fichiers PDF qu'il contient.
  • Enfoncer la touche F5 du clavier pour exécuter le formulaire,
  • Cliquer sur le bouton à l'icône du dossier,
  • Dans la boîte de dialogue qui se présente, pointer sur le dossier de décompression,
  • Puis, cliquer sur le bouton Ok en bas de la boîte de dialogue,
Mémoriser le chemin du dossier qui contient les fichiers PDF à convertir en VBA Word

Comme vous pouvez l'apprécier, le code VBA est déjà en mesure de récolter le chemin d'accès au dossier désigné. Et ce chemin est retranscrit en dur dans la zone de texte située à gauche du bouton. Pour information et c'est important, elle est nommée Chemin. Nous l'exploiterons par le code.

La déclaration des variables
Pour débuter et pour entrer dans le vif du sujet, nous devons développer le code VBA associé au clic sur le bouton Convertir. Et en premier lieu, nous devons déclarer les variables qui permettront notamment de parcourir les fichiers du dossier désigné mais aussi de manipuler les fichiers PDF.
  • Fermer le formulaire en cliquant sur le bouton Quitter,
  • Sur le formulaire en conception, double cliquer sur le bouton Convertir,
Nous basculons ainsi dans le code Visual Basic Word entre les bornes de la procédure événementielle Convertir_Click.
  • Dans les bornes de cette procédure, ajouter les déclarations suivantes :
Private Sub Convertir_Click()
Dim objFichier As Object: Dim leDossier AsObject: Dim chaqueFichier As Object
Dim instanceW As Object: Dim docPDF As Object: Dim leChemin As String


End Sub


Nous exploiterons la variable objFichier pour instancier la classe permettant de manipuler les fichiers et dossiers du système. Grâce à elle, nous pourrons initialiser la variable leDossier pour représenter le répertoire sélectionné par l'utilisateur. C'est ainsi, dans une boucle for each, que la variable chaqueFichier permettra de parcourir l'ensemble des documents PDF contenus. Ensuite, c'est une nouvelle instance de l'application Word (instanceW) qui permettra de prendre le contrôle sur les fichiers PDF, pour pouvoir importer les contenus sur l'instance du document en cours. Grâce à elle, nous génèrerons l'objet docPDF pour accéder aux contenus à récupérer. Il s'agit en effet de cinq variables objets qui prendront leur type au moment des affectations. Enfin, la variable leChemin parle d'elle-même. Elle est typée comme un texte (As String) pour mémoriser le chemin d'accès à chaque fichier PDF contenu dans le dossier à parcourir.

Tester le chemin d'accès
Avant de poursuivre et d'entamer la conversion de groupe, nous devons nous assurer que l'utilisateur a bien désigné un dossier. En d'autres termes, nous devons vérifier que le contenu de la zone de texte nommée chemin n'est pas vide.
  • A la suite du code de la procédure, ajouter l'instruction conditionnelle suivante :
If Chemin.Value <> "" Then

End If


C'est bien sûr la propriété Value d'un objet VBA de type TextBox qui permet d'atteindre son contenu pour le tester.

Instancier la classe des fichiers
Si le chemin d'accès est bien défini, nous devons maintenant instancier notamment la classe permettant de manipuler les fichiers du disque. Et pour cela comme vous le savez, le VBA offre une fonction qui se nomme CreateOnject, d'où la déclaration des variables en tant qu'objets.
  • Dans les bornes de l'instruction conditionnelle, ajouter les affectations suivantes :
...
Set objFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objFichier.GetFolder(Chemin.Value)
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
...


C'est l'argument scripting.filesystemobject passé à la fonction CreateObject qui permet à l'objet objFichier d'hériter des propriétés et méthodes permettant de manipuler les fichiers et dossiers. De fait, grâce à sa méthode GetFolder, elle initialise la variable leDossier pour représenter le répertoire choisi par l'utilisateur dont le chemin est passé en argument. Dès lors, nous créons une nouvelle instance de Word, toujours grâce à la fonction CreateObject mais cette fois avec le paramètre Word.Application. De fait, nous profitons de sa propriété Visible que nous réglons à False de manière à ce que ses traitements se réalisent en tâche de fond.

Parcourir les fichiers d'un dossier
Grâce à ces instanciations, la variable leDossier propose maintenant une propriété toute singulière renvoyant la collection des fichiers contenus dans le dossier mentionné. Cette propriété se nomme Files. Grâce à elle, nous allons pouvoir engager une boucle For Each sur la variable chaqueFichier afin de parcourir tous les éléments du répertoire.
  • A la suite du code de l'instruction conditionnelle, créer la boucle For Each suivante :
...
For Each chaqueFichier In leDossier.Files

Next chaqueFichier
...


C'est ainsi que la collection des fichiers du dossier spécifié est passée en revue.

Tester l'extension PDF
A chaque passage dans cette boucle, le traitement de conversion doit être entrepris si et seulement s'il s'agit bien d'un fichier de type PDF. Pour cela, nous devons vérifier l'extension du fichier en cours d'analyse au moment du passage. Une astuce consiste à tester les quatre derniers caractères (.pdf) grâce à la fonction VBA Right.
  • Dans la boucle For Each, ajouter l'instruction conditionnelle suivante :
...
If (Right(chaqueFichier, 4) = ".pdf") Then

End If
...


Comme son nom l'indique, la fonction Right permet de tester la fin d'une chaîne de caractères sur une longueur déterminée en second argument.

Effacer la précédente importation
A chaque passage dans cette boucle, nous devons importer l'intégralité du contenu de chaque fichier PDF pour l'inscrire sur le document en cours afin de le convertir au format Word sur le disque dur. En conséquence, avant chaque nouvelle importation, le précédent contenu importé doit tout d'abord être supprimé. Et pour le supprimer, il faut d'abord le sélectionner. Il s'agit de méthodes que nous connaissons bien désormais car nous les avons employées à maintes reprises au fil de la découverte de ces astuces VBA Word.
  • Dans l'instruction conditionnelle, ajouter les deux instructions VBA suivantes :
...
Selection.WholeStory
Selection.Delete
...


La méthode WholeStory de l'objet VBA Selection permet de sélectionner l'intégralité de l'article, soit du document. Sa méthode Delete se charge ensuite de supprimer le contenu sélectionné.

Piloter les fichiers PDF
Pour poursuivre, grâce à l'instance Word précédemment créée, nous disposons d'une méthode permettant de pointer sur chaque fichier parcouru par la boucle. Cette méthode va nous permettre d'initialiser la variable objet docPDF dont la vocation est de prendre le contrôle sur le contenu de chacun de ces fichiers.
  • Toujours à la suite du code, ajouter les deux lignes VBA suivantes :
...
leChemin = Chemin.Value & "\" & chaqueFichier.Name
Set docPDF = instanceW.Documents.Open(leChemin)
...


Nous connaissons le chemin d'accès au dossier. Grâce à lui, nous lui ajoutons le nom du fichier en cours d'analyse, après un antislash (\) pour bien descendre dans le sous dossier. Ensuite, nous passons ce chemin recomposé à la méthode Open de l'objet Documents de la nouvelle instance de Word. C'est ainsi que l'objet docPDF est initialisé et pointe sur le bon fichier. Au prochain passage dans la boucle, il pointera sur le fichier PDF suivant.

Importer le contenu de chaque fichier PDF
Grâce à cet objet docPDF, le contenu de chaque fichier PDF est chargé en mémoire tour à tour. C'est ainsi que l'instance Word peut y accéder pour le prélever et le rapatrier sur le document Word en cours. C'est ce que nous proposons de réaliser maintenant.
  • A la suite du code, ajouter les quatre instructions VBA suivantes :
...
instanceW.Selection.WholeStory
instanceW.Selection.Copy
Selection.Paste
Selection.HomeKey wdStory
...


C'est par le biais de l'instance que nous exploitons des méthodes VBA Word bien connues. Tout d'abord, nous sélectionnons tout le contenu du fichier PDF en cours d'analyse (WholeStory). Dès lors, sur le document en cours, cette fois directement avec l'objet Selection, nous collons ce contenu (Paste) puis, nous replaçons le point d'insertion en haut du document (HomeKey).

Convertir chaque fichier PDF
Chaque contenu PDF ainsi importé doit être enregistré au format Word sur le disque. Ainsi, chacun pourra laisser sa place au prochain contenu pour réitérer les mêmes opérations. Pour l'enregistrement, nous choisissons de conserver le même nom en remplaçant l'extension pdf par l'extension docx.
  • A la suite du code, toujours dans l'instruction conditionnelle, ajouter les deux lignes suivantes :
...
ActiveDocument.SaveAs2 Replace(leChemin, ".pdf", ""), wdFormatDocumentDefault
docPDF.Close
...


Nous exploitons la méthode SaveAs de l'objet ActiveDocument. Celui-ci désigne le document en cours, soit celui sur lequel nous importons chaque contenu PDF tour à tour. En premier paramètre, nous lui transmettons l'emplacement et le nom du fichier à créer. Pour cela, nous exploitons la méthode Replace afin de changer l'extension. Le second argument (wdFormatDocumentDefault) indique que l'enregistrement doit se faire au format Word. Ensuite, nous fermons l'objet docPDF pour libérer la mémoire du contenu précédemment chargé. Il sera recréé au prochain passage dans la boucle pour traiter le fichier PDF suivant.

Décharger les objets de programmation
Pour finir et pour coder proprement, il nous reste à décharger les objets de programmation que nous avons exploités pour instancier les classes. Bien sûr, ils doivent être libérés une fois qu'ils ne sont plus exploités, soit après la fin de la boucle For Each.
  • Après la boucle For Each, ajouter les instructions VBA suivantes :
...
instanceW.Quit
Set docPDF = Nothing
Set instanceW = Nothing
...


Nous sommes maintenant en mesure de tester le code de l'application.
  • Enregistrer les modifications (CTRL + S) et exécuter l'application (F5),
  • Sur le formulaire, cliquer sur le bouton portant l'icône du dossier,
  • Dans la boîte de dialogue, pointer sur le dossier de décompression,
  • Cliquer sur Ok pour revenir sur le formulaire,
  • Puis, cliquer sur le bouton Convertir,
Le processus prend un certain temps à s'engager pour réaliser la première importation. Une alerte Word peut surgir. Elle indique que le traitement de texte s'apprête à réaliser la conversion du fichier PDF. Il suffit de cocher la case "Ne plus afficher ce message" pour que l'alerte ne se déclenche plus lors des importations futures.

Dès lors, vous voyez les contenus défiler tour à tour sur le document actif. A l'issue, la vue reste figée sur la dernière importation.

Importer et convertir tous les fichiers PDF du dossier au format Word en VBA

Maintenant, si vous affichez le contenu du dossier de décompression, vous avez le plaisir de constater que tous les fichiers PDF ont été convertis au format Word. Et pour en avoir le coeur net, il suffit de les ouvrir dans Word. Tous les attributs de mise en forme et de mise en page sont conservés.

Transformer tous les fichiers PDF du dossier en documents Word par le code VBA

Le code VBA complet de la procédure que nous avons construite est le suivant :

Private Sub Convertir_Click()
Dim objFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim instanceW As Object: Dim docPDF As Object: Dim leChemin As String

If Chemin.Value <> "" Then
Set objFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objFichier.GetFolder(Chemin.Value)
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False

For Each chaqueFichier In leDossier.Files
If (Right(chaqueFichier, 4) = ".pdf") Then
Selection.WholeStory
Selection.Delete

leChemin = Chemin.Value & "\" & chaqueFichier.Name
Set docPDF = instanceW.Documents.Open(leChemin)

instanceW.Selection.WholeStory
instanceW.Selection.Copy
Selection.Paste
Selection.HomeKey wdStory

ActiveDocument.SaveAs2 Replace(leChemin, ".pdf", ""), wdFormatDocumentDefault
docPDF.Close
End If
Next chaqueFichier

instanceW.Quit
Set docPDF = Nothing
Set instanceW = Nothing

End If

End Sub


 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn