Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Inscription en base Access
Dans le précédent volet, nous avons appris Ã
parcourir tous les contrôles ActiveX composant un
formulaire sur le
document Word . Grâce à cette technique, nous avons pu vérifier le contenu de chaque champ pour nous assurer que toutes les informations requises étaient bien renseignées. Dans la suite logique, nous devons maintenant déployer le
code VBA Word pour récupérer les données de ces champs et les
archiver en
base de données Access .
Document et base à télécharger
Pour la mise en place de cette nouvelle
astuce VBA Word , nous devons récupérer ce
formulaire avec la
base de données permettant l'archivage des informations saisies.
Comme vous pouvez le voir, la décompression livre un
document Word et une
base de données Access .
Double cliquer sur le fichier inscrits.accdb pour l'ouvrir dans Access ,
Puis, dans le volet de navigation sur la gauche, double cliquer sur la table t_inscrits ,
Nous affichons ainsi son contenu en mode
feuille de données .
Les informations doivent être respectivement inscrites dans les champs ins_civilite, ins_nom, ins_prenom, ins_age et ins_logiciel. Il s'agit strictement des données à renseigner dans les
contrôles ActiveX du
formulaire Word .
Fermer la base de données Access ,
Puis, double cliquer sur le fichier archiver-sondage-bdd.docm pour l'ouvrir dans Word ,
Cliquer ensuite sur les boutons des bandeaux de sécurité,
Nous retrouvons bien le
formulaire du volet précédent avec ses
contrôles ActiveX .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word ,
Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément ThisDocument ,
Ainsi, nous affichons la feuille de code associée au document actif au centre de l'écran. Nous retrouvons tout d'abord la
procédure Document_Open pour charger les listes déroulantes à l'ouverture du document. Nous avions expliqué son fonctionnement lors du volet précédent. Ensuite, nous découvrons la présence d'une procédure un peu spéciale. Nous avons encapsulé le traitement consistant à parcourir tous les
contrôles ActiveX dans une
fonction :
Function verif() As Boolean
Dim controle As InlineShape
verif = True
For Each controle In ActiveDocument.InlineShapes
If (controle.OLEFormat.Object.Value = "") Then
verif = False
Exit For
End If
Next controle
End Function
Cette
fonction se nomme
verif . C'est elle qui indique si tous les champs ont bien été renseignés en retournant le
booléen True . Cette
fonction doit donc être appelée avant de procéder à l'inscription de l'utilisateur. En effet, en cas d'anomalie (False), le traitement doit être avorté.
Valider au clic sur le bouton
Pour engager la
procédure d'inscription , nous devons déclencher un
code VBA Word au
clic sur le bouton Valider . Il s'agit du dernier
contrôle ActiveX , tout en bas du
formulaire .
Revenir sur le document Word (ALT + Tab),
En haut de la fenêtre Word , cliquer sur l'onglet Développeur pour afficher son ruban,
Dans la section Contrôles de ce ruban, cliquer sur le bouton Mode Création ,
Dès lors, double cliquer sur le bouton Valider en bas du formulaire ,
Nous retournons ainsi dans l'
éditeur VBA Word mais cette fois dans les bornes de la
procédure valider_Click ainsi créée. C'est cette procédure que nous devons implémenter pour engager le
processus d'inscription en
base de données Access ,
au clic sur le bouton Valider donc.
La déclaration des variables
Pour débuter le traitement, nous avons besoin de
variables capables de
récolter les informations saisies par l'utilisateur dans les
contrôles ActiveX . Ce sont elles que nous utiliserons dans une
requête pour insérer leurs données dans la
table de la
base de données Access . Et donc, dans un deuxième temps, nous aurons besoin de
variables objets pour
piloter la base de données distante et ses
enregistrements .
Dans les bornes de la procédure valider_Click , ajouter les déclarations de variables suivantes :
...
Dim laCivilite As String
Dim leNom As String: Dim lePrenom As String
Dim lAge As String: Dim leLogiciel As String
...
Très simplement, nous déclarons les
cinq variables correspondant aux
cinq champs dont il s'agit de récupérer les informations. Naturellement, nous les typons comme des textes (As String).
Maintenant, il est question de
déclarer les variables permettant de prendre possession de la
base de données et des
enregistrements de sa table . Mais pour cela, une référence doit tout d'abord être ajoutée au projet. Cette référence concerne
Access . C'est elle qui offre les
objets ,
propriétés et
méthodes nécessaires pour piloter la
base de données depuis
Word .
En haut de l'éditeur, cliquer sur le menu Outils ,
Dans les propositions, choisir la commande Références ,
Dans la boîte de dialogue, cocher la case Microsoft Office 16.0 Access database ...,
Logiquement, cette référence doit déjà être intégrée car nous avions pris soin de l'ajouter au projet. Mais sachez que pour tout développement faisant appel aux
ressources d'Access , elle doit être ajoutée.
Cliquer sur le bouton Ok de la boîte de dialogue,
A la suite des déclarations précédentes, ajouter les déclarations suivantes :
...
Dim cheminBd As String: Dim requete As String
Dim enr As Recordset: Dim base As Database
...
La
variable cheminBd est typée comme un texte (String). Elle doit renseigner sur le
chemin d'accès complet à la
base de données Access dans laquelle il s'agit d'insérer les nouvelles informations. La
variable requete doit recevoir la syntaxe d'insertion des données. Elle est donc typée naturellement elle aussi comme un texte. Ensuite, nous déclarons respectivement les
variables objets enr et
base , grâce à la référence que nous avons ajoutée au projet. La seconde, déclarée comme un
objet de base de données (Database), doit instancier la
classe Access pour hériter de ses
propriétés et
méthodes . De fait, elle livrera une
méthode permettant à la première, déclarée comme un
objet manipulant les
enregistrements (Recordset), de précisément piloter ces
enregistrements depuis la
table distante .
Tester le formulaire
Maintenant que les variables existent, nous allons pouvoir les exploiter. Mais avant de lancer tout traitement, nous devons nous assurer que tous les renseignements ont bien été fournis. Pour cela, il suffit d'appeler la
fonction verif , celle dont nous avons développé le code à l'occasion du volet précédent.
Après les variables , ajouter l'instruction conditionnelle suivante :
...
If (verif = True) Then
Else
MsgBox "Tous les renseignements sont requis." & Chr(13) & "L'inscription ne peut pas être finalisée."
End If
...
Si la fonction renvoie le
booléen True , nous prévoyons la branche pour procéder au
processus d'inscription . Dans le cas contraire (else), nous indiquons à l'utilisateur qu'il doit compléter le formulaire s'il souhaite s'inscrire.
Récolter les valeurs des contrôles
Si les informations sont correctement remplies donc, nous devons ensuite récolter les valeurs saisies dans les
contrôles ActiveX pour les stocker dans les
variables prévues à cet effet. Ces
contrôles ActiveX sont respectivement nommés civilite, nom, prenom, tAge et logiciel. Sur le
document Word , vous pouvez le constater en activant le
mode création et en affichant la
fenêtre de propriétés pour un contrôle sélectionné.
Dans la première branche de l'instruction conditionnelle , ajouter le code VBA suivant :
...
laCivilite = civilite.Value
leNom = nom.Value
lePrenom = prenom.Value
lAge = tAge.Value
leLogiciel = logiciel.Value
...
C'est effectivement la
propriété Value d'un
contrôle ActiveX qui permet d'accéder à son contenu. Et ces contenus sont désormais tous stockés dans les
variables respectives .
Connexion à la base de données
Ces données, nous devons les insérer dans les
champs correspondants de la
base de données Access . Mais avant cela, nous devons nous assurer que l'
utilisateur n'est pas déjà inscrit pour ne pas risquer des doublons. Et pour ce faire, nous devons commencer par
établir la connexion à la base de données grâce aux
variables objets que nous avons déclarées.
A la suite du code dans le If, ajouter les deux instructions VBA suivantes :
...
cheminBd = ThisDocument.Path & "\inscrits.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
...
Tout d'abord, nous stockons le
chemin d'accès à la base de données dans la
variable cheminBd . C'est la
propriété Path de l'
objet ThisDocument qui donne l'adresse du dossier. Nous la concaténons avec le
nom du fichier préfixé d'un
antislash pour bien entrer dans ce dossier. Ensuite, nous
instancions la classe permettant de
piloter une base de données grâce à la
méthode OpenDatabase de l'
objet DBEngine . Désormais, l'
objet base pointe sur la
base de données du
dossier local grâce au chemin reconstitué qui est passé en paramètre de la
méthode OpenDatabase . Et cet objet va offrir des
méthodes pour piloter les
enregistrements . Il faut bien comprendre que cette instanciation a été rendue possible grâce à la référence ajoutée au projet.
Vérifier l'existence de l'inscrit
Nous l'avons évoqué précédemment, avant de chercher à insérer ces données, nous devons nous assurer que l'utilisateur n'est pas déjà inscrit. Et pour cela, nous devons vérifier l'existence de la paire Nom/Prénom grâce à une
requête Sql exécutée par la
méthode OpenRecordset de l'
objet base .
A la suite du code du If, ajouter les instructions VBA suivantes :
...
Set enr = base.OpenRecordset("SELECT ins_id FROM t_inscrits WHERE ins_nom='" & leNom & "' AND ins_prenom='" & lePrenom & "'", dbOpenDynaset)
If (enr.RecordCount = 0) Then
Else
MsgBox "Vous êtes déjà inscrit(e)"
End If
...
Nous initialisons donc l'
objet enr grâce à la
méthode OpenRecordset de l'
objet base , lui-même fraîchement initialisé. En premier paramètre de cette méthode, nous passons une
requête sélection classique sur la
table t_inscrits de la
base de données Access . Elle engage une
double clause Where , soit un double critère sur le nom et le prénom (WHERE ins_nom='" & leNom & "' AND ins_prenom='" & lePrenom & "'"). Il faut veiller à bien respecter l'alternance des simples et doubles côtes dans cette syntaxe. Dans cet assemblage de parties statiques et dynamiques, il faut garder à l'esprit que ces champs sont des informations textuelles. Elles sont donc à encadrer. Désormais, la
variable enr dispose des
propriétés et
méthodes pour piloter les
enregistrements résultants de cette
requête . C'est ainsi que nous exploitons sa
propriété RecordCount pour connaître le
nombre d'enregistrements correspondants . Si aucun enregistrement n'est retourné (=0), nous en concluons que nous pouvons poursuivre le
processus d'inscription . Le cas échéant (else), nous en informons l'utilisateur avec une boîte de dialogue.
Inscription en base de données Access
C'est maintenant une nouvelle
requête qui doit être exécutée. Mais il ne s'agit pas d'une banale requête sélection, il s'agit d'une
requête Ajout . Son rôle est d'
insérer chaque valeur récoltée par les variables, dans les
champs correspondants de la
table de la base de données . Et c'est une nouvelle
méthode de l'
objet base qui va permettre d'
exécuter cette requête .
Dans la première branche de cette instruction conditionnelle , ajouter ces lignes VBA :
...
requete = "INSERT INTO t_inscrits (ins_civilite, ins_nom, ins_prenom, ins_age, ins_logiciel) VALUES ('" & laCivilite & "','" & leNom & "','" & lePrenom & "','" & lAge & "','" & leLogiciel & "')"
base.Execute requete
MsgBox "Vous êtes désormais inscrit(e)"
...
C'est l'
instruction Sql INSERT INTO qui permet de désigner la
table d'insertion et d'
énumérer les champs ciblés. Seul le champ de la clé primaire n'est pas mentionné puisqu'il est auto-incrémenté. Ensuite, c'est l'
instruction Sql VALUES qui permet d'énumérer les valeurs correspondantes à insérer dans les
champs respectifs . Comme il s'agit de variables, nous sommes obligés de les concaténer, toujours en respectant l'alternance des simples et doubles côtes, pour les mêmes raisons que précédemment. Dès lors, la
méthode Execute de l'
objet base déclenche cette
requête distante pour procéder à l'inscription des
données Word dans la
base de données Access . Ensuite, l'utilisateur est informé de son inscription par le biais d'une boîte de dialogue, grâce à la fonction MsgBox.
Fermer les objets de base de données
Ce n'est pas tout à fait terminé. Pour coder proprement, nous devons
décharger les objets de base de données de la mémoire . Et ces instructions doivent intervenir à la fin du premier If, avant le Else.
Ajouter les quatre lignes VBA suivantes :
...
Else
MsgBox "Vous êtes déjà inscrit(e)"
End If
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
Else
MsgBox "Tous les renseignements sont requis." & Chr(13) &" L'inscription ne peut pas être finalisée."
End If
...
Inscrire un nouveau candidat
Il ne nous reste plus qu'Ã tester le fonctionnement de notre
formulaire Word d'inscription .
Enregistrer les modifications (CTRL + S) et basculer sur le document Word (ALT + Tab),
Maintenant, si vous ne remplissez pas tous les champs et que vous validez l'inscription, le message de neutralisation intervient. En revanche, si vous remplissez correctement le
formulaire et que vous cliquez sur le
bouton Valider , c'est le
message de confirmation qui apparaît.
Et si vous souhaitez vérifier que l'
inscription s'est effectivement bien déroulée dans la
table de la base de données Access , il vous suffit de l'ouvrir pour constater la présence du
nouvel enregistrement ,
issu de Word .
Le
code VBA complet que nous avons produit pour
établir la connexion entre
Word et
Access est le suivant :
Private Sub valider_Click()
Dim laCivilite As String
Dim leNom As String: Dim lePrenom As String
Dim lAge As String: Dim leLogiciel As String
Dim cheminBd As String: Dim requete As String
Dim enr As Recordset: Dim base As Database
If (verif = True) Then
laCivilite = civilite.Value
leNom = nom.Value
lePrenom = prenom.Value
lAge = tAge.Value
leLogiciel = logiciel.Value
cheminBd = ThisDocument.Path & "\inscrits.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
Set enr = base.OpenRecordset("SELECT ins_id FROM t_inscrits WHERE ins_nom='" & leNom & "' AND ins_prenom='" & lePrenom & "'", dbOpenDynaset)
If (enr.RecordCount = 0) Then
requete = "INSERT INTO t_inscrits (ins_civilite, ins_nom, ins_prenom, ins_age, ins_logiciel) VALUES ('" & laCivilite & "','" & leNom & "','" & lePrenom & "','" & lAge & "','" & leLogiciel & "')"
base.Execute requete
MsgBox "Vous êtes désormais inscrit(e)"
Else
MsgBox "Vous êtes déjà inscrit(e)"
End If
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
Else
MsgBox "Tous les renseignements sont requis." & Chr(13) & "L'inscription ne peut pas être finalisée."
End If
End Sub