formateur informatique

Importer des données d'un tableau Word en VBA Access

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Importer des données d'un tableau Word en VBA Access
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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,
Tableau Word à importer dans Access en VBA

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.

Table Access pour recvoir les données importées depuis Word en VBA

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.

Formulaire Access pour importer les données du tableau Word en VBA

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,
Références au projet VBA Access pour piloter Word et les bases de données

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,
Processus d-importation des données du tableau Word dans Access

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,
Données Word importées dans une table Access en VBA

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn