Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Lire une ou plusieurs pages PDF
Lorsque nous avions monté l'application de la
visionneuse PDF sur un
formulaire Access , nous avions appris à récupérer le contenu complet de ces types de fichiers. Ici, nous souhaitons réaliser des
importations sélectives en définissant la
page de départ et la
page de fin , pour isoler des informations précises.
Base de données Access à télécharger
Pour réaliser ces travaux, nous suggérons d'appuyer l'étude sur une
base de données Access offrant un
formulaire permettant de désigner un
fichier PDF ou
Word à importer.
Vous notez la présence d'une grande zone de texte pour accueillir les contenus des
fichiers externes Word et PDF . Sur la droite, deux zones de saisie permettent de définir en valeurs numériques, les
pages de départ et de fin , pour borner l'importation. Juste en-dessous, un bouton à l'icône d'un dossier doit permettre à l'utilisateur de sélectionner l'un de ces fichiers à importer depuis le disque dur.
Office et la sécurité des macros
Depuis 2022 et les dernières mises à jour, les logiciels de la gamme Office ne plaisantent plus avec
la sécurité des macros . Elles ne peuvent plus s'exécuter en toute impunité. Les fichiers qui les hébergent doivent être stockés dans des
emplacements approuvés . En l'occurrence, il s'agit d'un répertoire caché dans les profondeurs des réglages d'Office. Pour que nos
macros , absolument inoffensives, puissent s'exécuter, nous devons intervenir sur ces paramétrages.
En haut à gauche de la fenêtre Access , cliquer sur le menu Fichier ,
En bas à gauche de la liste des propositions, choisir la rubrique Options ,
En bas de la boîte de dialogue, cliquer sur la ligne Centre de gestion de la confidentialité ,
Cliquer alors sur le bouton Paramètres du Centre de gestion de la confidentialité ,
Dans la nouvelle boîte de dialogue, cliquer sur la rubrique Emplacements approuvés ,
En bas de la boîte de dialogue, cliquer sur le bouton Ajouter un nouvel emplacement ,
Dans la zone Chemin d'accès , définir le dossier dans lequel sont placées vos sources,
Vous pouvez aussi choisir le lecteur parent.
Cliquer sur les boutons Ok des boîtes de dialogue pour valider et revenir sur le formulaire,
Dans cette application, comme nous allons faire appel à une
instance de Word pour accéder aux contenus des
fichiers Word et
PDF , les mêmes réglages, selon le même protocole, doivent être réalisés sous
Microsoft Word .
La procédure VBA du bouton
Maintenant, nous pouvons débuter la conception du code. Nous devons commencer par créer la procédure à associer au bouton à l'icône du dossier. Son rôle est de récupérer le contenu d'un
fichier Pdf ou
Docx désigné par l'utilisateur par le biais d'une boîte de dialogue.
A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage ,
Dans les propositions, choisir le mode Création ,
Sur le formulaire en conception, sélectionner le bouton à l'icône d'un dossier,
Activer alors l'onglet Evénement de sa feuille de propriétés ,
Cliquer sur le petit bouton associé à son événement Au clic ,
Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
Nous basculons dans l'
éditeur VBA Access , entre les bornes de la
procédure parcourir_Click .
Les variables
Nous avons besoin de
quelques variables et d'objets notamment pour
piloter une
instance de Word mais aussi les
boîtes de dialogue standards d'Office .
Dans les bornes de la procédure, ajouter les déclarations suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim laPage As Range
Dim instanceW As Object: Dim doc As Object
...
Le premier objet (boite) doit servir Ã
instancier la
classe des boîtes de dialogue . La
variable chemin doit mémoriser le
chemin d'accès au fichier désigné par l'utilisateur par le biais d'une de ces boîtes de dialogue. L'
objet laPage déclaré comme une plage (une zone) doit représenter la
sélection du contenu à extraire depuis le fichier choisi. Les deux derniers objets sont prévus pour piloter une
instance de Word et un
document à l'intérieur, celui correspondant au choix de l'utilisateur.
La classe des boîtes de dialogue
Les objets étant déclarés, nous pouvons maintenant
instancier la classe des boîtes de dialogue pour ouvrir celle qui permet de désigner un fichier. Et si un fichier est effectivement spécifié par l'utilisateur, alors nous pourrons choisir de poursuivre le traitement.
A la suite du code, ajouter les instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFilePicker)
boite.Filters.Add "Fichiers PDF DocX", "*.pdf; *.docx", 1
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
End If
...
Nous exploitons la
propriété FileDialog de l'
objet Application avec le
paramètre msoFileDialogFilePicker pour initialiser (Set) notre
objet boite sur une
boîte de dialogue permettant de
sélectionner un fichier du disque. Ensuite, nous l'affichons à l'écran (Show). Nous récupérons le
chemin d'accès du fichier désigné dans la
variable chemin . C'est la
propriété SelectedItems qui renvoie la
collection des fichiers sélectionnés . Comme nous n'avons pas autorisé la multi sélection, nous savons que le fichier choisi est en tête de file (1). Enfin, si l'utilisateur a bien spécifié un fichier (If chemin <> "" Then), donc qu'il n'a pas cliqué sur le bouton Annuler, nous choisissons de poursuivre le traitement. Le cas échéant, le code est ainsi avorté.
L'instance de Word
Pour accéder au contenu du fichier désigné, nous devons créer une
instance de Word pour l'ouvrir à l'intérieur mais en mémoire.
Dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
Set doc = instanceW.Documents.Open(chemin, False, False, Format:=wdOpenFormatAuto)
...
Avec le
paramètre Word.Application passé à la
fonction VBA CreateObject , nous initialisons (Set) notre
objet instanceW sur une
nouvelle instance de Word . Grâce à sa
propriété héritée Visible réglée Ã
False , nous demandons un traitement en tâche de fond, pour qu'aucune fenêtre de Word ne se déclenche. Dès lors, nous exploitons la
méthode Open de sa
collection Documents pour initialiser (Set) l'
objet doc sur le fichier dont il est question de récupérer une partie du contenu.
Récupérer une partie du contenu
Grâce à cette
instance , nous allons maintenant pouvoir exploiter les objets et méthodes classiques du
VBA Word pour définir la plage de départ et celle de fin et ainsi prélever le contenu entre ces bornes.
A la suite, dans l'instruction conditionnelle, ajouter les nouvelles lignes VBA suivantes :
...
instanceW.Selection.GoTo wdGoToPage, wdGoToAbsolute, depart.Value
Set laPage = instanceW.Selection.Range
instanceW.Selection.GoTo wdGoToPage, wdGoToAbsolute, fin.Value
laPage.End = instanceW.Selection.Bookmarks("\Page").Range.End
laPage.Select
...
Grâce à la
méthode GoTo de l'
objet Selection , nous demandons d'atteindre une page (wdGoToPage) en partant de la première (wdGoToAbsolute) du document ouvert en mémoire. Cette page est renseignée par le numéro saisi dans la première des deux zones de texte (depart). Dès lors, nous initialisons l'
objet laPage sur cet emplacement. Et avec la même méthode, nous rejoignons cette fois la page dont le numéro est indiqué dans la seconde zone de saisie (fin). C'est ainsi que la
propriété End de l'
objet Range sur le
repère de la page (\Page) et non d'une section permet d'étendre la sélection du début de la première page désignée jusqu'à la fin de la dernière. Nous réalisons la sélection en mémoire de cette plage (Select).
Importer la sélection sur le formulaire
Pour restituer la sélection sur le formulaire Access, son contenu doit être importé. Comme il est géré en mémoire, la sélection doit être copiée puis collée dans la zone de texte enrichie du formulaire.
A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
laPage.Copy
contenu.SetFocus
DoCmd.RunCommand acCmdPaste
SendKeys ("^{HOME}")
...
C'est la
méthode Copy de l'
objet laPage qui permet de charger la sélection en mémoire. Pour pouvoir la copier dans la zone de texte enrichie (contenu) sur le formulaire, nous la sélectionnons dans un premier temps (SetFocus). Puis, nous exploitons la
méthode RunCommand de l'
objet VBA Access DoCmd pour la coller (acCmdPaste). Comme ce contenu est susceptible d'être long, nous organisons une remontée pour recaler l'affichage vers le haut de la zone en simulant le
raccourci CTRL + Home .
Libérer la mémoire
Pour finir de coder proprement, nous devons libérer la mémoire de l'ordinateur en fermant et en détruisant les objets de programmation qui ne sont plus utilisés.
A la fin et hors de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
SendKeys ("^{HOME}")
doc.Close
instanceW.Quit
Set doc = Nothing
Set instanceW = Nothing
End If
Set boite = Nothing
...
Nous exploitons les
méthodes Close et
Quit pour fermer l'
objet du document dans l'instance et l'
instance elle-même . Ensuite, nous réinitialisons les objets (Set) Ã
Nothing pour les sortir de la mémoire de l'ordinateur.
Importer la sélection PDF dans Access
Il est temps de tester le code d'importation sélective.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
L'exécuter, par exemple en enfonçant la touche F5 du clavier,
Cliquer sur le bouton à l'icône d'un dossier,
Dans la boîte de dialogue, double cliquer sur un document Word fait de quelques pages,
Après traitement, le contenu parfaitement borné entre les pages définies dans les zones de saisie pour le départ et l'arrivée, est parfaitement restitué.
Si vous réalisez la même opération sur un document PDF, vous constatez que l'importation est elle aussi réalisée mais pas forcément parfaitement. Il peut exister un décalage de quelques lignes entre le haut de la page de début et le bas de celle de fin. C'est une explication que je ne suis pas en mesure de fournir à ce jour. Le problème reste à l'étude.
Si vous changez les bornes en tapant de nouvelles valeurs numériques dans les zones de texte et que vous tentez de nouvelles importations, vous avez le plaisir de constater que vous maîtrisez l'importation sélective de fichiers externes aux formats PDF et Word dans un formulaire Access.