Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Remplir automatiquement un formulaire
Ce nouveau sujet est l'occasion de débuter une nouvelle aventure en
VBA Word . Nous proposons de développer une solution de
facturation complètement automatisée par le biais d'un
formulaire se connectant à une
base de données Access . Cette solution, nous allons la décomposer en six volets car il y a du pain sur la planche. Dans ce premier chapitre, nous devons nous contenter de
remplir les champs d'un
formulaire VBA Word , au choix d'une référence Ã
ajouter à la facture .
L'exemple illustré par la capture présente la solution finalisée. L'utilisateur choisit une référence, émanant d'une
base de données Access , avec une
liste déroulante . Instantanément, les informations attachées sont rapatriées dans les
zones de texte . Il définit une
quantité achetée et clique sur le
bouton Ajouter . Dès lors, une nouvelle ligne se crée dans le
tableau de la facturation , en arrière-plan du
formulaire sur le
document Word . Puis, il poursuit avec une nouvelle référence et ainsi de suite. A l'issue, il clique sur le
bouton Créer . La
facture est alors générée au
format PDF et les
stocks sont
mis à jour dans la
base de données source.
Document Word et base Access à télécharger
Pour la création de cette
application de facturation , nous proposons de nous appuyer sur des sources existantes. Elles offrent le
document Word avec son
formulaire ainsi que la
base de données Access et un sous dossier pour
archiver les factures au
format PDF .
La décompression livre en effet le
document Word avec l'
extension docm pour le
VBA , la
base de données Access et le
sous dossier nommé
archives .
La base de données Access
Concernant cette base de données, il est important de connaître sa structure pour pouvoir la questionner.
Double cliquer sur le fichier articles.accdb pour l'ouvrir dans Access ,
Comme l'indique le volet de navigation sur la gauche de l'écran, cette petite
base de données n'est constituée que de
deux tables . Nous exploiterons la
table TempProduits dans les volets suivants. Elle est destinée à mémoriser les
quantités d'articles achetés pour réaliser la
mise à jour des stocks dans la
table Produits une fois la
facture validée .
Double cliquer sur la table Produits pour l'afficher en mode feuille de données ,
Comme vous pouvez le voir, elle propose des
articles vestimentaires à la vente.
La
référence est cruciale. C'est elle qui doit permettre à l'opérateur de désigner un produit acheté. Son champ se nomme
produit_ref . Et pour construire la
facture sur le document Word , nous aurons besoin de rapatrier les informations attachées, respectivement stockées dans les
champs produit_nom ,
produit_prix et
produit_stock .
Le formulaire Word de facturation
Il est temps de découvrir le
formulaire existant et qu'il est question d'implémenter par le
code VBA .
Fermer la base de données Access ,
Dans le dossier de décompression, double cliquer sur le fichier remplir-formulaire.docm ,
Cliquer sur les boutons des bandeaux de sécurité pour accéder aux ressources complètes,
Comme vous pouvez le voir, un
formulaire est d'ores et déjà programmé pour s'imposer à l'
ouverture du document Word .
Dans cette première phase, nous devons faire en sorte que la
liste déroulante soit chargée des
références issues de la
table Produits de la
base de données Access . Ensuite, au choix de l'une de ces
références , nous devons rapatrier les informations attachées dans les
champs correspondants du
formulaire .
C'est ainsi que nous disposerons de toutes les données pour permettre à l'utilisateur d'
ajouter une nouvelle ligne à la facture qui se propose sur le
document Word , en arrière-plan du
formulaire .
Charger la liste déroulante avec les données Access
Nous l'avons dit, la première étape consiste Ã
charger la liste déroulante . Elle est le départ de tout. Et pour cela, nous devons
établir la connexion à la base de données Access par le
code VBA Word .
Fermer le formulaire Word en cliquant sur la croix de son onglet,
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 Facturation ,
Ainsi, nous affichons le
formulaire en
mode conception .
Dès lors, double cliquer sur un emplacement vide du formulaire ,
Nous basculons ainsi dans la feuille de code entre les bornes de la
procédure événementielle UserForm_Click . Mais le
chargement de la liste déroulante des références ne doit pas intervenir au clic sur le formulaire. Il doit intervenir au
chargement de ce dernier. Et pour cela, il existe un événement dédié. Il se nomme
Activate .
En haut de l'éditeur de code, déployer la liste déroulante de droite ,
Puis, choisir l'événement Activate ,
Cette action a pour effet de créer la
procédure événementielle UserForm_Activate . C'est elle qui va déterminer le
chargement du formulaire .
De fait, la précédente procédure n'est plus utile.
Sélectionner l'intégralité de la procédure UserForm_Click ,
Puis, la supprimer (Touche Suppr),
En haut de l'éditeur VBA , cliquer sur le menu Outils ,
Dans les propositions, cliquer sur la rubrique Références ,
Il existe une librairie essentielle que nous avons pris soin d'ajouter au projet en amont. Elle se nomme
Microsoft Office 16.0 Access database engine Object . Le numéro (16.0) dépend de votre
version d'Access . Sans elle, il n'est pas possible de piloter les
objets de base de données Access par le
code VBA . Donc, si elle n'est pas déclarée dans votre projet, vous devez la cocher.
Cliquer sur le bouton Ok pour revenir sur la feuille de code,
Dans les bornes de la procédure UserForm_Activate , ajouter les déclarations de variables :
...
Dim cheminBd As String: Dim requete As String
Dim enr As Recordset: Dim base As Database
...
Nous déclarons la
variable cheminBd comme un
String , soit comme un texte. Son rôle est de mémoriser le
chemin d'accès à la
base de données Access pour pouvoir l'attaquer. C'est par anticipation que nous déclarons la
variable requete , elle aussi comme un
String . Dans l'une des phases de ce projet, nous l'utiliserons pour vider la
table temporaire destinée à mémoriser les quantités à mettre à jour dans les stocks. Enfin, nous déclarons deux
variables de base de données , grâce à la référence ajoutée au projet. La seconde, nommée
base et de
type Database , est destinée à prendre possession de la
base de données Access , identifiée par son chemin d'accès. La première, nommée
enr et de
typeRecordset , est vouée Ã
piloter les enregistrements de cette base.
Après les déclarations de variables , ajouter les initialisations suivantes :
...
cheminBd = ThisDocument.Path & "\articles.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
Set enr = base.OpenRecordset("SELECT produit_ref FROM Produits", dbOpenDynaset)
...
C'est la
propriété Path de l'
objet ThisDocument qui renseigne sur le
chemin d'accès à l'
application locale . Nous lui concaténons un antislash (\) pour entrer dans le dossier, et le nom de la base de données à piloter. Ensuite, nous procédons aux
instanciations de classes grâce au
mot clé Set . Grâce à la
méthode OpenDatabase de l'
objet DBEngine , l'
objet base hérite des
propriétés et méthodes pour manipuler la
base de données dont le
chemin d'accès est passé en paramètre de la méthode. Dès lors, cet
objet peut exploiter la
méthode OpenRecordset avec une
requête Sql en paramètre. Elle livre l'accès aux références (produit_ref) de la
table Produits . C'est donc l'
objet enr , ainsi initialisé, qui pilote désormais ces
enregistrements . Grâce à lui, nous allons pouvoir
charger la liste déroulante .
Maintenant, nous devons placer le pointeur de lecture sur le
premier enregistrement résultant de cette
requête . Ensuite, nous devons les
parcourir tous grâce à une
boucle pour récupérer
chaque référence tour à tour et les ajouter dans la
liste déroulante .
A la suite du code, ajouter les instructions VBA suivantes :
...
enr.MoveFirst
Do
Ref.AddItem enr.Fields("produit_ref").Value
enr.MoveNext
Loop Until enr.EOF
...
Grâce à la précédente instanciation, l'
objet enr a lui aussi hérité de
propriétés et méthodes . La
méthode MoveFirst est très parlante. Elle permet de placer le point de lecture sur le
premier enregistrement , soit sur la
première référence . Ensuite, nous engageons une
boucle de lecture (Do) sur l'
intégralité des enregistrements (Loop Until enr.EOF). La
propriété EOF de l'
objet enr signifie
End Of File , soit
fin du fichier . Comprenez : Jusqu'au
dernier enregistrement . Et donc, à chaque passage dans cette boucle, nous ajoutons la nouvelle référence grâce à la
méthode AddItem de l'
objet de liste déroulante que nous avons nommé
Ref . Vous pouvez le vérifier en sélectionnant le contrôle sur le formulaire en conception et en consultant la
fenêtre propriétés . C'est la
propriété Fields de l'
objet enr qui permet de désigner un champ par son nom passé en paramètre. Dès lors, la
propriété enfant Value permet d'accéder à son contenu pour le récupérer, sur l'
enregistrement en cours de lecture bien sûr.
Nous n'en avons pas tout à fait terminé avec le développement de cette procédure. Comme nous l'avons déjà appris, notamment au travers des
développements en VBA Excel , les
objets de base de données doivent être déchargés à l'issue.
A la suite du code, ajouter les instructions suivantes :
...
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
...
Nous exploitons tout d'abord la
méthode Close sur les
deux objets de base de données , afin de les
fermer . Puis, nous les réinitialisons Ã
Nothing (Rien) pour les
vider complètement de la
mémoire de l'ordinateur.
Enregistrer les modifications (CTRL + S),
Puis, exécuter le code avec la touche F5 du clavier ,
Sur le formulaire qui apparaît, déployer la liste déroulante des références ,
Comme vous pouvez l'apprécier, la
base de données Access a été questionnée en un temps record pour livrer
toutes les références qui vont nous permettre de construire pas à pas l'
application de facturation en VBA Word .
Remplir les champs du formulaire Word
Désormais, le choix de l'une de ces références doit permettre de
remplir les champs du formulaire avec les informations qui lui sont attachées. Ces données devront figurer sur les lignes de la
facture Word . Nous devons donc nous reconnecter à la
base de données , lorsqu'une référence est choisie.
Fermer le formulaire Word en cliquant sur la croix de son onglet,
Sur le formulaire en conception , double cliquer sur la liste déroulante ,
Grâce à cette action, nous retournons dans la
feuille de code mais cette fois, entre les bornes de la
procédure événementielle Ref_Change . Son code se déclenchera à chaque fois qu'une nouvelle référence est choisie.
Puisqu'il s'agit de récolter les données attachées à la référence désignée, nous devons commencer par déclarer les mêmes variables que précédemment.
Dans les bornes de la procédure, ajouter les déclarations et affectations suivantes :
...
Dim cheminBd As String
Dim enr As Recordset: Dim base As Database
cheminBd = ThisDocument.Path & "\articles.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
...
C'est la
requête sélection qui change pour que l'
objet enr puisse prélever le
nom , le
prix et le
stock de la référence choisie. Donc, une
clause Where doit être envisagée.
A la suite du code, initialiser la variable enr comme suit :
...
Set enr = base.OpenRecordset("SELECT produit_nom, produit_prix, produit_stock FROM Produits WHERE produit_ref='" & Ref.Value & "'", dbOpenDynaset)
...
Nous récupérons donc les informations sur le nom, le prix et le stock à partir de la
table Produits mais pour lesquelles la
référence produit est identique à celle désignée par l'utilisateur avec la liste déroulante (WHERE produit_ref='" & Ref.Value & "'"). Attention de bien respecter l'alternance des simples et doubles côtes pour encadrer la valeur de la référence, qui est une information de type texte.
Un seul enregistrement résultera de cette requête. Pour prélever ses informations, nous avons néanmoins besoin de placer le pointeur de lecture dessus, grâce à la même méthode que précédemment.
A la suite du code, ajouter les instructions VBA suivantes :
...
enr.MoveFirst
Nom.Value = enr.Fields("produit_nom").Value
Prix.Value = enr.Fields("produit_prix").Value
Stock.Value = enr.Fields("produit_stock").Value
...
Les
champs du formulaire se nomment respectivement
Nom ,
Prix et
Stock . Grâce à leur
propriété Value , nous les remplissons des informations correspondantes prélevées dans les champs respectifs grâce à la
propriété Fields de l'
objet enr .
Pour finir, nous ne devons pas oublier de décharger les
objets de base de données .
A la suite du code, ajouter les instructions VBA suivantes :
...
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
...
Enregistrer les modifications (CTRL + S) et exécuter le code (F5),
Sur le formulaire, choisir une référence avec la liste déroulante,
Comme vous pouvez le voir, les informations concordantes sont aussitôt importées dans les champs respectifs du formulaire.
La donnée sur le
stock disponible est une indication qu'il nous faudra contrôler à l'avenir par le
code VBA . C'est la raison pour laquelle elle apparaît grisée. C'est sa
propriété Enabled qui a été réglée Ã
False en amont. L'utilisateur n'a plus qu'à saisir une quantité achetée. C'est alors un
code VBA que nous devons développer, qui doit se déclencher au
clic sur le bouton Ajouter , pour implémenter la
facture Word avec ces informations ajoutées au coup par coup.