Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
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.
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,
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.
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.
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