Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Exporter dans un tableau Word
Au cours des précédentes astuces, nous avons découvert différentes techniques pour
exporter les données de tables Access . Notamment, nous avons appris à exporter les informations dans une
feuille Excel à la suite des précédentes exportations.
Ici, nous souhaitons réaliser l'
exportation des données Access dans un tableau d'un
nouveau fichier Word . L'enjeu est donc le suivant : Il consiste tout d'abord à piloter une
instance de Word par le
code VBA Access . Sur cette nouvelle instance, il est ensuite question de
créer un tableau . Puis, pour
chaque enregistrement parcouru dans la
table Access , les
informations des champs doivent être introduites dans les
colonnes distinctes de ce tableau .
Base de données Access à télécharger
Pour réaliser ces travaux, nous proposons de partir d'une
base de données hébergeant un
formulaire accueillant déjà un
code VBA Access parcourant les
enregistrements de tables .
Comme vous le constatez, la décompression livre le
fichier de la base de données accompagné d'un
sous dossier . Nous exploiterons ce dernier pour y réaliser les
exportations Word .
Double cliquer sur le fichier de base de données pour l'ouvrir dans Access ,
Cliquer ensuite sur le bouton Activer le contenu du bandeau de sécurité,
Dans le volet de navigation sur la gauche, double cliquer sur le formulaire fExport ,
Ainsi, nous l'exécutons.
Une
liste déroulante permet de choisir l'une des tables de la base de données. C'est un
code VBA Access qui se déclenche au
chargement du formulaire pour
parcourir toutes les tables et ainsi remplir cette liste de choix de leurs noms. Dès lors, un clic sur le
bouton Exporter doit permettre de reconstruire tous les enregistrements de la table désignée dans un
tableau d'un
nouveau fichier Word . Ces tables sont les suites logiques les unes des autres. Elles sont toutes architecturées de la même façon.
Dans le volet de navigation, double cliquer sur la table societes1 ,
De cette manière, nous affichons son contenu en mode
feuille de données .
Ces tables énumèrent des activités de sorties dans différents départements de France. Nous souhaitons extraire les informations de
tous les enregistrements du
champ societes_nom au
champ societes_ville . Il est donc question d'exclure la clé primaire de l'exportation (societes_id) et le dernier champ (societes_cp). Nous devons donc récolter les informations du
champ numéro 1 au
champ numéro 4 . L'énumération débute par le champ numéro 0 comme vous le savez. C'est un
tableau de quatre colonnes que nous devons créer sur le
nouveau document Word , pour accueillir ces données.
Le code VBA de lecture des données
Nous l'avons dit, le
code VBA de lecture des enregistrements est déjà associé au
bouton Exporter . Etant donné que nous l'avons développé à l'occasion de plusieurs astuces précédentes, il serait dommage de le refaire une énième fois. Ainsi, nous allons pouvoir focaliser l'étude sur la
technique d'exportation de ces données dans un
tableau d'un
nouveau document Word . Nous proposons néanmoins de le survoler pour le commenter rapidement.
Fermer la table societes1 en cliquant sur la croix de son onglet,
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, cliquer sur le bouton Exporter pour le sélectionner,
Dès lors, activer l'onglet Evénement de sa feuille de propriétés ,
Puis, cliquer sur le petit bouton associé à son événement Au clic ,
Comme un
code VBA lui est déjà attaché, nous basculons directement dans l'
éditeur VBA Access , entre les bornes de la
procédure événementielle exporter_Click .
Tout d'abord, nous récupérons le
nom de la table choisie en
variable (nomTable = listeTables.Value). Nous définissons le
chemin d'accès du fichier Word à créer dans le
sous dossier export de l'
application locale (nomF = CurrentProject.Path & "\export\donnees.docx"). Puis, nous initialisons les
objets de base de données , pour pouvoir
piloter les enregistrements de cette table désignée dans la
base de données en cours :
Set base = CurrentDb()
Set enr = base.OpenRecordset(nomTable)
Set table = base.TableDefs(nomTable)
Ensuite, nous parcourons
tous les champs de cette table pour stocker leurs noms dans un
tableau de variables :
For Each champ In table.Fields
champs(compteur) = champ.Name
compteur = compteur + 1
Next
Enfin, nous procédons à la
lecture de tous les enregistrements de la table , grâce à une
boucle Do :
enr.MoveFirst
Do
compteL = compteL + 1
enr.MoveNext
Loop Until enr.EOF
La variable de l'instance et sa référence
Pour
créer un nouveau document Word et l'implémenter avec les
données à exporter , nous avons besoin de
déclarer un objet représentant l'une de ses
instances . Mais pour que cet objet hérite de toutes les
propriétés et méthodes utiles, nous avons besoin d'ajouter la
librairie faisant référence Ã
Word dans le projet.
En haut de l'éditeur VBA Access , cliquer sur le menu Outils ,
Dans les propositions, choisir l'option Références ,
Dans la boîte de dialogue, cocher la case Microsoft Word 16.0 Object Library ,
Le numéro (16.0) dépend de votre version d'Office.
Cliquer alors sur le bouton Ok pour revenir sur la feuille de code,
Dans la partie déclarative de la procédure, créer l'objet suivant :
Private Sub exporter_Click()
Dim base As Database: Dim enr As Recordset
Dim nomTable As String: Dim compteur As Integer
Dim nomF As String: Dim champs() As String
Dim compteC As Byte: Dim table As TableDef: Dim champ As Field
Dim compteL As Integer: Dim instanceW As Object
...
C'est lui qui doit représenter l'instance de Word. Nous le déclarons comme un objet au sens large (Object). Il prendra son type au moment de l'affectation.
Créer l'instance de Word et son tableau
Et précisément, c'est maintenant que nous devons
instancier la classe de Word pour que cet objet hérite des propriétés et méthodes lui permettant de manipuler un
nouveau document . Pour cela et comme nous en avons l'habitude, nous allons exploiter la
fonction VBA CreateObject .
Sous les objets de base de données , ajouter les initialisations suivantes :
...
Set base = CurrentDb()
Set enr = base.OpenRecordset(nomTable)
Set table = base.TableDefs(nomTable)
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
instanceW.Documents.Add DocumentType := wdNewBlankDocument
instanceW.Selection.PageSetup.Orientation = wdOrientLandscape
instanceW.Selection.Tables.Add instanceW.Selection.Range, 1, 4, wdWord9TableBehavior
...
Grâce au
paramètre Word.Application passé à la
fonction CreateObject , nous
instancions la classe de Word . De fait, l'
objet instanceW ainsi initialisé (Set), hérite de ses propriétés et méthodes. Et pour preuve, dans l'enchaînement, nous exploitons sa
propriété Visible que nous réglons Ã
False . Nous ne souhaitons pas voir apparaître de
fenêtre de Word . Nous voulons que ce
processus d'exportation se réalise en
tâche de fond . Dès lors, nous exploitons la
propriété Add de sa
collection Documents pour
créer un nouveau document Word , grâce à la
valeur wdNewBlankDocument passée en paramètre. Ensuite, nous faisons un
réglage de mise en page pour une
orientation paysage (wdOrientLandscape) afin de pouvoir disposer confortablement toutes les informations de champs les unes à côté des autres. C'est alors que nous exploitons la
méthode Add de la
collection Tables de l'
objet Selection pour
créer un nouveau tableau . L'
objet Selection désigne la
sélection active . Dans un
nouveau document , il pointe tout en haut de la page puisque rien n'a encore été créé. Nous fabriquons un
tableau d'une ligne et de quatre colonnes (1,4) avec des
bordures (wdWord9TableBehavior). Les lignes manquantes, nous les ajouterons au coup par coup comme nous avons appris à le faire au travers de la
formation pour remplir la facture en VBA Word .
Inscrire la ligne d'entêtes
Maintenant que le
document Word et son
tableau sont créés, nous devons les enrichir. Et pour cela, nous devons commencer par inscrire les
noms de champs en
première ligne du tableau pour reconstituer les
entêtes des enregistrements . Nous devons intervenir au niveau de la
boucle For Each qui suit dans ce
code VBA . Elle récolte précisément les
noms de ces champs dans un
tableau de variables .
Adapter la boucle For Each existante comme suit :
...
For Each champ In table.Fields
If (compteur > 0 And compteur < 5) Then
champs(compteur) = champ.Name
instanceW.Selection.Tables(1).Cell(1, compteur).Range.Text = champ.Name
End If
compteur = compteur + 1
Next
...
Le double critère de l'
instruction conditionnelle consiste à ignorer le premier et le dernier champ, comme nous l'avons annoncé. Ensuite, grâce à l'
objet Selection de l'
instance Word , nous exploitons sa
collection Tables pour désigner le premier tableau (1) dans ce document. En effet, nous n'avons créé qu'un seul tableau. Puis, nous pointons sur les cellules respectives de la première ligne (1), grâce à l'
objet Cell . C'est la
variable compteur qui permet de décaler l'inscription des
noms de champs (champ.Name) dans les colonnes voisines, en partant de la première.
Exporter les données de chaque enregistrement
Désormais, c'est la
boucle Do qui suit que nous devons enrichir. Elle parcourt déjà toutes les données de chaque enregistrement de la table désignée par l'utilisateur. Ces informations, nous devons les ajouter à la suite dans le tableau pour lequel nous avons pour l'instant seulementre constitué la ligne d'entête. A chaque
nouvel enregistrement Access , nous devons commencer par
créer une nouvelle ligne dans le
tableau Word pour accueillir ses informations.
Adapter le code VBA de la boucle Do comme suit :
...
enr.MoveFirst
Do
instanceW.Selection.Tables(1).Cell(compteL, 4).Select
instanceW.Selection.InsertRowsBelow 1
For compteur = 1 To 4
instanceW.Selection.Tables(1).Cell(compteL + 1, compteur).Range.Text = enr.Fields(champs(compteur)).Value
Next compteur
compteL = compteL + 1
enr.MoveNext
Loop Until enr.EOF
...
A chaque passage, en commençant par le premier, nous nous plaçons sur la
dernière colonne de la
ligne en cours dans le
tableau (Cell(compteL, 4)). C'est ainsi dans l'enchaînement que nous pouvons
insérer une nouvelle ligne (instanceW.Selection.InsertRowsBelow 1), comme nous le ferions avec la souris. Dès lors, nous parcourons les
quatre champs de l'
enregistrement en cours (For compteur = 1 To 4). Et nous les inscrivons tour à tour dans leurs colonnes respectives (Cell(compteL + 1, compteur)), grâce à la
variable compteL qui pointe sur la
nouvelle ligne et grâce à la
variable compteur qui s'incrémente automatiquement dans cette boucle, pour désigner tour à tour les
colonnes correspondantes .
Enregistrer les exportations au format Word
Une fois ce traitement opéré, donc une fois que tous les enregistrements ont été passés en revue, nous devons
enregistrer le document Word pour
sauvegarder ce tableau des exportations . Ce sont des techniques que nous avons écumées depuis que nous avons appris ensemble Ã
programmer en VBA Word .
Après la boucle Do, ajouter les trois instructions VBA suivantes :
...
Next compteur
compteL = compteL + 1
enr.MoveNext
Loop Until enr.EOF
instanceW.ActiveDocument.SaveAs2 nomF, wdFormatDocumentDefault
instanceW.Quit
Set instanceW = Nothing
MsgBox "L'exportation de la table dans Word est terminée.", vbInformation
...
Grâce à la
méthode SaveAs de l'
objet ActiveDocument qui désigne le
document Word en cours , nous enregistrons le travail sous le nom (nomF) que nous avions reconstruit en début de code. Et cette sauvegarde, nous la faisons au format Word classique (wdFormatDocumentDefault). Puis, nous fermons (Quit) et détruisons (Set Nothing) la
variable de l'instance Word pour libérer la mémoire de l'ordinateur.
Exportation dans le tableau Word
Il ne nous reste plus qu'Ã tester le
code VBA Access et à être quelque peu patient pendant le déroulement du processus car les enregistrements sont nombreux. Donc, les lignes à construire sur le
document Word le sont tout autant. Pour agrémenter l'attente, nous aurions d'ailleurs pu ajouter une
barre de progression sur le
formulaire Access . Mais ça, nous avons également déjà appris à le faire.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
L'exécuter en enfonçant par exemple la touche F5 du clavier ,
Avec la liste déroulante, choisir la table societes1 ,
Puis, cliquer sur le bouton Exporter ,
Le
processus d'extraction et d'exportation prend quelques secondes. Mais à l'issue, le message de confirmation commandité par la
fonction VBA MsgBox apparaît. Tout semble s'être parfaitement déroulé.
Cliquer sur le bouton Ok de la boîte de dialogue pour la fermer,
Dans l'explorateur Windows, ouvrir le sous dossier export du dossier de décompression,
Vous notez la présence d'un
fichier Word nommé donnees.docx et relativement volumineux.
Double cliquer sur ce fichier pour l'ouvrir dans Word ,
Comme vous pouvez le constater avec satisfaction, toutes les données de
chaque enregistrement de la
table Access ont été parfaitement exportées et scrupuleusement rangées dans les
bonnes colonnes du
tableau Word .