Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Importer et convertir les PDF
Les
fichiers PDF sont une vue figée d'un document ou d'une présentation. Leur vocation est d'offrir une
mise en page qui reste fidèle quel que soit l'environnement. Mais sans outil dédié, il n'est pas possible d'intervenir dans la conception pour apporter des modifications ou améliorations. Pourtant, lorsque vous détenez des archives inscrites uniquement dans ce format, l'enjeu consiste tôt ou tard à pouvoir récupérer les contenus pour les faire évoluer. Cette nouvelle
astuce VBA Word montre comment
importer les données de fichiers PDF tout en les convertissant pour pouvoir les manipuler en conception et récupérer les
attributs de mise en forme.
Le bouton de Macro
Une fois n'est pas coutume, nous proposons de commencer par configurer l'environnement de travail. Cette nouvelle fonctionnalité d'importation est intéressante. Nous suggérons donc d'enregistrer le
code VBA Word dans le
modèle (Normal.dotm) et de l'associer à un
bouton permanent à greffer dans une section d'un
ruban personnalisé.
- Démarrer Word et créer un nouveau document vierge,
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
- Dans l'explorateur de projet sur la gauche, sélectionner l'élément Normal,
- En haut de l'éditeur, cliquer sur le menu Insertion,
- Dans les propositions, choisir la commande Module,
Un nouveau Module apparaît dans l'arborescence du dossier Modules pour le projet associé au modèle Word (Normal). Sa feuille de code se rend disponible au centre de l'écran. Elle est vierge pour l'instant.
- Avec la fenêtre Propriétés, renommer ce module sous l'intitulé Importation,
La fenêtre propriétés est accessible par le biais du
menu Affichage en choisissant la commande
Fenêtre Propriétés.
- Dans la feuille de code, créer la procédure importPDF,
Bien que vide, la
procédure de code VBA existe désormais. Nous proposons de l'associer à un
bouton de macro. Dès lors, nous pourrons nous concentrer sur le
développement du code.
- Revenir sur le document Word (ALT + Tab),
- Cliquer droit n'importe où sur le ruban actif,
- Dans le menu contextuel, choisir la commande Personnaliser le ruban,
- Dans la liste de droite, cliquer sur le symbole Plus (+) du ruban Outils,
Il s'agit d'un ruban que nous avons créé à l'occasion de précédentes
astuces. Si vous ne le possédez pas, vous pouvez le créer en cliquant sur le
bouton Nouvel onglet en bas de la boîte de dialogue.
- En bas de la boîte de dialogue, cliquer sur le bouton Nouveau groupe,
- Puis, cliquer sur le bouton Renommer,
- Dans la boîte de dialogue qui suit, taper l'intitulé : Données externes,
Nous créons ainsi une
nouvelle section dans ce
ruban personnalisé. Elle est destinée à accueillir toutes les fonctionnalités que nous concevrons pour manipuler les informations de
fichiers externes.
- Cliquer sur le bouton Ok pour valider ce nom,
- Déployer alors la zone déroulante au-dessus de la liste de gauche,
- Dans les propositions, choisir la catégorie Macros,
- Dès lors, glisser la macro importPDF dans le nouveau groupe créé précédemment,
- Cliquer sur le bouton Renommer en bas de la boîte de dialogue,
- Dans celle qui suit, taper l'intitulé : Import1PDF,
Le chiffre 1 permettra de différencier d'autres solutions que nous apporterons, notamment pour réaliser une
conversion de masse des fichiers PDF dans un dossier.
- Cliquer alors sur une icône représentative pour le décrire explicitement,
- Cliquer sur le bouton Ok pour valider ces réglages,
- Cliquer sur le bouton Ok de la première boîte de dialogue pour revenir sur le document Word,
Désormais, si vous activez l'
onglet Outils, vous avez le plaisir de constater la présence du nouveau
bouton d'importation dans sa nouvelle section. Il ne nous reste plus qu'à développer son
code VBA.
La déclaration des variables
Pour débuter, nous devons tout d'abord déclarer les variables nécessaires aux traitements. Une
boîte de dialogue est notamment nécessaire pour pointer sur le
fichier PDF Ã importer et convertir.
- Revenir dans l'éditeur VBA Word (ALT + F11),
- Entre les bornes de la procédure importPDF, ajouter les quatre déclarations suivantes :
Sub importPDF()
Dim boite As FileDialog: Dim chemin As String
Dim instanceW As Object: Dim docPDF As Object
End Sub
Nousl'avons annoncé, nous déclarons tout d'abord une
variable objet nommée
boite que nous typons comme un
objet de
type boîte de dialogue. La
variable chemin, typée comme un
texte (String) doit servir à mémoriser le
chemin d'accès au fichier PDF désigné par l'utilisateur par le biais de la
boîte de dialogue. C'est ainsi que nous pourrons accéder à son contenu par le
code VBA. Ensuite, la
variable instanceW, typée comme un objet au sens large, est un peu particulière. Elle doit servir à créer une nouvelle instance d'une
application Word. Elle va ainsi livrer des
propriétés et méthodes pour permettre à l'autre objet (docPDF) de prendre le contrôle sur le fichier PDF distant.
La boîte de dialogue des fichiers
Maintenant, nous devons créer cette
boîte de dialogue d'ouverture de fichiers pour l'afficher ensuite à l'écran. C'est donc notre
variable objet boite qui doit être initialisée.
- A la suite du code de la procédure, ajouter les deux instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...
C'est la
méthode FileDialog de l'
objet Application qui permet d'initialiser cette
boîte de dialogue. Avec la
valeur msoFileDialogFilePicker passée en paramètre et proposée par IntelliSense, nous définissons une
boîte de dialogue pour
ouvrir des fichiers. Dès lors, la variable boite hérite des propriétés et méthodes instanciées de cette classe. La
méthode Show permet d'
afficher la boîte de dialogue. La
propriété SelectedItems renvoie une
collection des fichiers sélectionnés par l'utilisateur. Comme nous ne l'avons pas définie pour une multi-sélection, nous savons que le fichier désigné se trouve sur la première rangée de cette collection (tableau).
Si vous exécutez le code à ce stade, la
boîte de dialogue se déclenche en effet. Elle permet de pointer sur un dossier et de désigner un fichier.
Avant d'engager la suite des traitements, nous devons nous assurer que l'utilisateur a bien pointé sur un fichier et qu'il n'a pas cliqué sur le
bouton Annuler. En d'autres termes, nous devons vérifier que la
variable chemin n'est pas vide.
- A la suite du code, créer l'instruction conditionnelle suivante :
...
If chemin <> "" And Right(chemin, 4) = ".pdf" Then
Else
MsgBox "traitement abandonné"
End If
...
C'est donc un
double critère que nous vérifions. Le
chemin ne doit pas être vide et dans le même temps, nous nous assurons que l'
extension du fichier est bien celle d'un
fichier pdf. Grâce à la
fonction VBA Right, nous prélevons les
quatre derniers caractères de la chaîne que nous comparons avec l'
extension attendue. Dans le cas où cette double condition n'est pas honorée (Else), nous mettons fin au traitement puisque nous déroutons l'exécution du code dans une autre branche. Et nous en informons l'utilisateur avec une
boîte de message (MsgBox).
Instance d'une application Word
Il est maintenant question de créer l'instance de l'application Word. Ses
propriétés et méthodes permettront de pointer sur le
fichier PDF dont le
chemin d'accès est emmagasiné dans la
variable chemin.
- Dans l'instruction conditionnelle, ajouter tout d'abord les deux lignes VBA suivantes :
...
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
...
Nous l'avons déjà exploitée à maintes reprises dans nos
développements VBA, notamment avec
Excel, c'est la
fonction CreateObject qui permet d'
instancier une classe. Avec la
valeur Word.Application en paramètre, nous créons donc une nouvelle
instance de Word. Dès lors, la
propriété hérité Visible de l'
objet instanceW ainsi affecté, permet de réaliser un traitement en
tâche de fond, donc sans que la nouvelle instance de l'application n'apparaisse.
Copier le contenu du PDF distant
Cette
nouvelle instance va maintenant nous permettre d'
accéder au fichier PDF précédemment désigné par le biais de la
boîte de dialogue. C'est bien en tâche de fond qu'elle doit sélectionner et copier en mémoire tout le contenu de ce
document PDF.
- A la suite du code, toujours dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set docPDF = instanceW.Documents.Open(chemin)
instanceW.Selection.WholeStory
instanceW.Selection.Copy
...
Sur cette nouvelle instance, c'est la
méthode Open de la
propriété Documents qui permet de pointer sur le
fichier PDF dont l'accès est stocké dans la
variable chemin. C'est une méthode qui propose de nombreux paramètres mais ils sont tous facultatifs hormis le premier pour le chemin du fichier. Ensuite la
méthode WholeStory de l'
objet Selection pour cette
instance désigne l'
intégralité du contenu du
fichier PDF. Nous n'avons plus qu'à le prélever en mémoire pour ensuite pouvoir le restituer sur le nouveau document. C'est ce que nous faisons avec la
méthode Copy de l'
objet Selection.
Importer le PDF et sauvegarder
Il est maintenant temps de rapatrier l'intégralité du contenu mis en forme, non pas dans cette nouvelle instance mais sur le document vierge.
- A la suite du code, ajouter les instructions VBA suivantes :
...
Selection.Paste
Selection.HomeKey wdStory
...
Cette fois donc, nous ne préfixons pas le code de l'instance pour agir. La
méthode Paste de l'
objet Selection permet de coller sur le document actif, le contenu stocké en mémoire. Ensuite, la
méthode HomeKey avec le
paramètre wdStory permet de replacer le pointeur de lecture au tout début du document.
Si vous exécutez le
code VBA à ce stade, après avoir désigné un
fichier PDF à importer et après avoir validé, le
contenu PDF est parfaitement récupéré avec sa mise en forme. Nous recouvrons donc une version complètement modifiable à partir d'une vue originellement figée. Il est à noter que lors de la première exécution, une boîte de dialogue de confirmation se déclenche. Elle indique que
Word va procéder à la
conversion du fichier PDF. Il suffit de cocher la case "Ne plus afficher ce message" et de valider pour ne plus la voir apparaître à l'avenir.
Enregistrer et vider la mémoire
Pour parfaire la solution de ce volet, il convient de créer une copie sauvegardée de ce
contenu PDF au
format Word. Il ne faut pas oublier non plus de détruire les variables objets pour libérer la mémoire.
- A la suite du code VBA, ajouter les dernières instructions suivantes :
...
ActiveDocument.SaveAs2 Replace(chemin, ".pdf", ""), wdFormatDocumentDefault
docPDF.Close
instanceW.Quit
Set docPDF = Nothing
Set instanceW = Nothing
...
Très simplement et nous le savons, c'est la
méthode SaveAs de l'
objet ActiveDocument qui permet d'engager la sauvegarde. En premier paramètre, nous désignons le
chemin et le nom du fichier. Pour cela, nous utilisons la
fonction Replace afin de supprimer l'
extension PDF. Ensecond paramètre, c'est la
valeur wdFormatDocumentDefault qui indique le format de sortie, le
format Word classique. Dès lors, nous exploitons les
méthodes respectives
Close et
Quit pour fermer les objets. Il ne nous reste plus qu'à les détruire en les réaffectant (Set) sur la valeur Nothing.
Si vous enregistrez les modifications, que vous basculez sur le
document Word, que vous cliquez sur le
bouton du ruban personnalisé, que vous sélectionnez un
fichier PDF et que vous le validez, après un temps de traitement pour la conversion, non seulement vous constatez que le
contenu PDF est récupéré mais aussi que sa
version modifiable au
format Word est enregistrée dans le
dossier de l'application VBA Word.
Le code complet de la
procédure d'importation PDF est le suivant :
Sub importPDF()
Dim boite As FileDialog: Dim chemin As String
Dim instanceW As Object: Dim docPDF As Object
Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" And Right(chemin, 4) = ".pdf" Then
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
Set docPDF = instanceW.Documents.Open(chemin)
instanceW.Selection.WholeStory
instanceW.Selection.Copy
Selection.Paste
Selection.HomeKey wdStory
ActiveDocument.SaveAs2 Replace(chemin, ".pdf", ""), wdFormatDocumentDefault
docPDF.Close
instanceW.Quit
Set docPDF = Nothing
Set instanceW = Nothing
Else
MsgBox "traitement abandonné"
End If
End Sub