Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Importer depuis un tableau Word
Dans le chapitre précédent, nous avons appris Ã
importer des données issues d'un
tableau Excel dans une
table Access . Dans ce nouveau volet, nous allons apprendre Ã
importer des données d'un
tableau Word dans
Access . Même si les techniques sont assez similaires, nous allons le voir, des différences notables sont à observer, notamment sur les
objets distants .
Base de données Access à télécharger
Pour développer cette nouvelle solution, nous suggérons d'appuyer l'étude sur un
formulaire Access d'importation accompagné d'un
tableau Word fournissant les
données à récolter .
Comme vous pouvez le voir, la décompression livre le
fichier de la base de données . Il est intitulé
importer-tableau-word.accdb . Il est accompagné d'un
sous-dossier nommé
sources .
Double cliquer sur ce sous-dossier pour l'ouvrir,
Nous y découvrons la présence d'un
fichier Word :
tableau-source.docx .
Double cliquer sur ce dernier pour l'ouvrir dans Word ,
Nous y découvrons la présence d'un
tableau Word recensant des activités de sorties, sur
quatre champs . Nous allons le voir, ce tableau est agencé fort naturellement comme la
table Access de réception. Il s'étend sur 25 pages. Il est donc fait d'une multitude d'enregistrements à rapatrier.
Fermer le document Word en cliquant sur la croix de sa fenêtre,
A la racine du dossier de décompression, double cliquer sur le fichier de base de données ,
Cliquer alors sur le bouton Activer le contenu du bandeau de sécurité,
Dans le volet de navigation sur la gauche, double cliquer sur la table societes ,
Ainsi, nous affichons son contenu en mode
feuille de données .
Cette table, hormis le champ de la clé primaire et un autre champ en dernière position, attend bien les informations énoncées dans les colonnes du tableau Word que nous venons de consulter.
Fermer la table en cliquant sur la croix de son onglet,
Dans le volet de navigation, double cliquer sur le formulaire fImport ,
Ainsi, nous l'exécutons.
Ce formulaire, outre la présence d'un
contrôle ActiveX progressBar pour rendre compte de l'état d'avancement du processus d'importation, est doté de
deux boutons .
Le premier est intitulé
Importer . C'est aussi son
nom d'objet . C'est au clic sur ce bouton que le
code VBA que nous devons construire, doit se connecter au
fichier Word pour récupérer toutes les données que renferment chaque cellule de son tableau.
La procédure d'importation
La première action que nous devons entreprendre consiste à créer la
procédure de code associée à ce
bouton et destinée à enclencher le
traitement VBA d'importation des données depuis Word .
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 Importer 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 ,
Dans la boîte de dialogue qui suit, choisir le générateur de code et valider par Ok,
C'est ainsi que nous basculons dans l'
éditeur de code VBA Access entre les bornes de la
procédure événementielle importer_Click . Son code se déclenchera au clic sur ce bouton.
Deux références sont nécessaires pour aboutir cette solution. Nous les avons déjà intégrées. Nous proposons néanmoins de le constater.
En haut de l'éditeur, cliquer sur le menu Outils pour le déployer,
Dans les propositions, choisir l'option Références ,
Deux lignes nous intéressent, au milieu des autres. La première librairie se nomme
Microsoft Word 16.0 Object Library . Sa case est cochée. La seconde se nomme
Microsoft Office 16.0 Object Library . Sa case est aussi cochée. La première permettra d'
instancier la classe de Word tandis que la seconde permettra de manipuler les
boîtes de dialogue standards d'Office .
Les variables
Pour débuter le code, nous avons besoin de
déclarer certaines variables . Il faut piloter l'
instance de Word , la
boîte de dialogue d'ouverture de fichiers , la
base de données en cours et il faut aussi récolter les informations détenues par les
cellules du tableau Word .
Cliquer sur le bouton Ok de la boîte de dialogue pour revenir sur la feuille de code,
Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim instanceW As Word.Application
Dim base As Database: Dim requete As String
Dim ligne As Long: Dim nbLignes As Long
Dim nom As String: Dim act As String: Dim dep As String: Dim ville As String
Set boite = Application.FileDialog(msoFileDialogFilePicker)
If boite.Show Then chemin = boite.SelectedItems(1)
...
Nous typons l'
objet boite comme un
FileDialog grâce à la deuxième référence que nous avons ajoutée au projet. Nous l'utiliserons pour piloter une
boîte de dialogue d'ouverture de fichiers . Dans la
variable chemin , nous stockerons le
chemin d'accès au document Word désigné par l'utilisateur, par le biais de cette boîte de dialogue. Le
type Word.Application est associé à l'
objet instanceW pour qu'il puisse
instancier la classe de Word . Là encore, cette déclaration est rendue possible grâce à la première des deux références. L'
objet base , typé comme un
Database , doit manipuler la
base de données en cours . Grâce à lui, nous exécuterons une
requête ajout sur son unique table, avec une
syntaxe SQL que nous enregistrerons dans la
variable requete .
Les
variables ligne et nbLignes sont typées comme des
entiers longs (As Long). La première doit suivre le processus d'analyse des lignes du tableau Word. La seconde doit savoir de combien de lignes ce tableau est fait. C'est grâce à elle que nous pourrons
étalonner la barre de progression du formulaire. Enfin, les quatre dernières variables sont typées comme des
textes . Pour chaque ligne du tableau Word, elles doivent récolter les informations respectives des champs afin de nourrir les requêtes insertion à exercer sur la base de données.
Nous passons ensuite à la phase d'initialisation. La
propriété FileDialog de l'
objet Application initialise (Set) l'
objet boite sur une
boîte de dialogue d'ouverture de fichiers . Grâce à sa
méthode héritée Show , nous l'affichons à l'écran. Puis, nous stockons le
chemin d'accès désigné par l'utilisateur dans la
variable chemin . La
collection héritée SelectedItems représente tous les fichiers sélectionnés par l'utilisateur. En l'absence de paramétrage, ces boîtes standards n'autorisent pas la multi-sélection. Donc, nous récupérons le chemin d'accès du fichier en tête dans la collection (1).
L'instance Word et la base active
Maintenant que nous connaissons le chemin du document à analyser, nous pouvons
initialiser l'instance de Word sur ce fichier. Nous allons aussi en profiter pour faire pointer notre
objet base , sur la
base de données active . Mais avant cela, nous devons nous assurer que l'utilisateur n'a pas cliqué sur le bouton Annuler de la boîte de dialogue et donc, qu'un chemin est bien renseigné.
A la suite du code, ajouter les instructions VBA suivantes :
...
If chemin <> "" Then
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
instanceW.Documents.Open chemin
Set base = CurrentDb()
ligne = 2
nbLignes = instanceW.ActiveDocument.Tables(1).Rows.Count
End If
...
Si le chemin d'accès est bien désigné (chemin <> ""), alors nous poursuivons le traitement. C'est alors que nous initialisons (Set) la
variable instanceW sur une
nouvelle instance de Word , grâce à la
fonction VBA CreateObject . Dès lors, nous exploitons sa
propriété héritée Visible pour ne pas afficher de fenêtre de Word. Nous souhaitons que le processus se déroule en tâche de fond. Puis, nous désignons le fichier à piloter en passant son
chemin d'accès à la
méthode Open de la
collection héritée Documents . Ensuite, c'est la
fonction VBA Access CurrentDb qui permet d'initialiser l'
objet base sur la
base de données en cours . Enfin, avec la
collection héritée Tables sur le document actif de l'instance (ActiveDocument), nous comptons le
nombre de lignes du tableau (Rows.Count). Cette information, nous la stockons dans la
variable nbLignes .
Parcourir les lignes du tableau Word
Puisque le document Word est maintenant ouvert en mémoire, il est temps d'entreprendre une boucle destinée à parcourir toutes les lignes de son tableau.
A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Do While instanceW.Selection.Tables(1).Cell(ligne, 1).Range.Text <> ""
With instanceW.Selection.Tables(1)
ligne = ligne + 1
End With
Loop
...
Sur le tableau du document piloté (Selection.Tables(1)), nous vérifions que la cellule de la première colonne pour la ligne en cours (Cell(ligne, 1)), n'est pas vide (Range.Text <> ""). C'est ainsi que nous poursuivrons le traitement de façon récursive, tant qu'il existe des données à rapatrier. Nous préparons un
bloc With car nous allons massivement agir sur ce tableau. Comme vous le savez, cette technique permet de ne pas répéter inutilement des objets (instanceW.Selection.Tables(1)) rappelés trop souvent. Bien sûr, à chaque passage dans cette boucle, nous n'oublions pas d'
incrémenter la variable ligne (ligne = ligne + 1). C'est elle qui doit suivre l'analyse de la boucle et la déplacer sur les lignes suivantes du tableau à chaque itération.
Récolter depuis Word
Grâce à ce
bloc With et à l'
objet Cell de l'instance, nous allons maintenant pouvoir récolter chaque information de champ pour la ligne en cours d'analyse par la boucle.
Dans le bloc With, ajouter les lignes VBA suivantes :
...
With instanceW.Selection.Tables(1)
nom = Left(.Cell(ligne, 1).Range.Text, Len(.Cell(ligne, 1).Range.Text) - 1)
act = Left(.Cell(ligne, 2).Range.Text, Len(.Cell(ligne, 2).Range.Text) - 1)
dep = Left(.Cell(ligne, 3).Range.Text, Len(.Cell(ligne, 3).Range.Text) - 1)
ville = Left(.Cell(ligne, 4).Range.Text, Len(.Cell(ligne, 4).Range.Text) - 1)
ligne = ligne + 1
End With
...
Nous pointons sur les colonnes respectives (1, 2, 3 et 4) du tableau de l'instance Word pour enregistrer les données dans les variables dédiées (nom, act, dep et ville), déclarées à cet effet. Néanmoins, nous engageons un traitement sur chaque contenu avec les
fonctions VBA Left et Len . Ce traitement consiste à prélever les informations jusqu'à l'avant dernier caractère pour ne pas importer la marque de fin de cellule.
Importer les données Word ligne à ligne
Nous devons désormais intégrer ces informations dynamiques dans la
syntaxe SQL d'une
requête ajout à exécuter sur la base de données en cours. C'est ainsi que toutes les données seront rapatriées dans la table, les unes après les autres.
Dans le bloc With et avant l'incrémentation de la variable ligne, ajouter les lignes suivantes :
...
dep = Left(.Cell(ligne, 3).Range.Text, Len(.Cell(ligne, 3).Range.Text) - 1)
ville = Left(.Cell(ligne, 4).Range.Text, Len(.Cell(ligne, 4).Range.Text) - 1)
requete = "INSERT INTO societes(societes_nom, societes_activite, societes_departement, societes_ville) VALUES ('" & nom & "','" & act & "','" & dep & "','" & ville & "')"
base.Execute requete
evolution.Value = Int((ligne * 100) / nbLignes)
If ligne = nbLignes Then Exit Do
ligne = ligne + 1
End With
...
Nous construisons une
syntaxe SQL d'insertion classique. Attention néanmoins à bien respecter l'alternance des simples et doubles côtes dans la
clause VALUES , pour concaténer les informations textuelles à insérer dans les champs respectifs de la table. Ensuite, nous exécutons cette requête (base.Execute requete), à chaque passage dans la boucle, donc pour chaque ligne prélevée depuis le tableau Word. Nous étalonnons la barre de progression. Elle se nomme
evolution . La
fonction Int renvoie la partie entière de la règle de trois que nous réalisons. Enfin, nous imposons l'
arrêt de la boucle (Exit Do) lorsque la fin est atteinte (ligne = nbLignes), pour ne pas rester bloqué sur cette dernière ligne.
Décharger les objets
Pour finir, il nous reste à décharger les objets de programmation, comme nous le faisons pratiquement à chaque développement.
A la fin du code, ajouter les instructions VBA suivantes :
...
End With
Loop
instanceW.Quit
Set instanceW = Nothing
base.Close
Set base = Nothing
End If
MsgBox "L'importation des données Word est terminée"
Set boite = Nothing
...
Les destructions de l'instance Word et de l'objet de base de données interviennent dans l'instruction conditionnelle puisque c'est dans cette dernière qu'ils ont été initialisés. Celle de l'objet boite intervient en dehors puisque son initialisation a pris effet avant cette instruction.
Enregistrer les modifications (CTRL + S) et basculer sur le formulaire Access (ALT + Tab),
Exécuter ce dernier, par exemple en enfonçant la touche F5 du clavier,
Cliquer sur le bouton Importer ,
Dans la boîte de dialogue, double cliquer sur le fichier tableau-source.docx ,
Comme vous pouvez l'apprécier, le processus d'importation s'enclenche. La barre de progression en atteste. A l'issue, un message de confirmation apparaît.
Valider le message et double cliquer sur la table societes pour l'afficher,
C'est un fait, ce sont bien toutes les informations du tableau Word désigné par l'utilisateur qui sont importées dans la table Access et ce, grâce à un code VBA Access.