Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Créer les lignes de la facture
Dans ce nouveau volet, nous poursuivons la construction de l'
application de facturation automatisée en
VBA Word. Dans le précédent et premier volet, nous avons chargé les
champs du formulaire des informations attachées à la
référence choisie par l'utilisateur, par le biais d'une liste déroulante. Ici, nous devons permettre d'
ajouter ces lignes à la facture en fonction des références produits achetées.
Document Word et base Access à télécharger
Pour poursuivre les travaux, nous devons commencer par récupérer les sources au dernier indice de
développement.
La décompression fournit un
document Word, une
base de données Access et un
sous dossier pour
archiver les factures au
format PDF, une fois que l'application sera achevée.
- Double cliquer sur le document Word pour l'ouvrir,
- Cliquer sur les boutons des bandeaux de sécurité pour activer les ressources,
Comme vous pouvez le voir, un
formulaire se déclenche automatiquement à l'
ouverture du document. C'est lui qui doit permettre de
construire la facture qui est ébauchée sur le document en arrière-plan.
Si vous choisissez une
référence avec la
liste déroulante, vous remarquez effectivement que toutes les données attachées viennent s'inscrire dans les
champs correspondants du
formulaire. Il s'agit de l'aboutissement du développement précédent. Et ces informations émanent de la
base de données Access qui est située dans le
même dossier local que le
document Word.
Désormais l'utilisateur doit définir une
quantité achetée dans la zone prévue à cet effet, en bas à gauche du formulaire. Puis, au clic sur le
bouton Ajouter, cette ligne d'achat doit s'inscrire dans la
facture en arrière-plan. Ce sont les informations sur la référence, la désignation, la quantité, le prix unitaire et le montant total hors taxes qui sont attendues. Et à chaque article ajouté, c'est une nouvelle ligne qui doit être créée automatiquement, par le
code VBA Word bien entendu.
La ligne en cours dans la facture
Pour chaque référence ajoutée, nous devons commencer par savoir quelle est la
ligne en cours dans la
facture. C'est ainsi que nous pourrons ajouter une
nouvelle écriture en dessous de la précédente. Et seule une
variable publique est capable de conserver la mémoire entre deux traitements.
- Fermer le formulaire 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,
Nous affichons ainsi le
formulaire dans sa vue en
conception.
- Double cliquer sur le bouton Ajouter,
Nous basculons ainsi sur la feuille de code entre les
bornes de la procédure Valider_Click. Le nom du bouton (Valider) est effectivement différent de son intitulé (Ajouter). Nous l'avons dit, cette procédure doit créer les
lignes de la facture. Mais avant cela, nous devons déclarer et initialiser notre
variable publique.
- Remonter en haut de la feuille et placer le point d'insertion avant la procédure Ref_Change,
- Puis, ajouter les deux instructions VBA suivantes :
Option Explicit
Dim laLigne As Byte
L'instruction
Option Explicit est intéressante. Elle impose la
déclaration des variables utilisées. Ce n'est pas le cas en son absence car le
VBA est permissif. Ensuite, nous déclarons la
variable laLigne que nous typons comme un
entier court (Byte). Ainsi, elle permettra d'ajouter jusqu'à 255 lignes à la facture.
Comme cette
variable est déclarée en dehors de toute procédure, elle est
publique. Elle va donc conserver la mémoire de la
ligne en cours de traitement dans la facture. Cependant, bien qu'elle soit déclarée, elle n'est pas encore initialisée. Et elle doit l'être sur la première ligne à remplir, qui n'est autre que la
deuxième ligne du tableau, sous les titres.
- Dans la procédure UserForm_Activate, ajouter l'initialisation suivante :
...
Private Sub UserForm_Activate()
Dim cheminBd As String: Dim requete As String
Dim enr As Recordset: Dim base As Database
laLigne = 2
cheminBd = ThisDocument.Path & "\articles.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
Set enr = base.OpenRecordset("SELECT produit_ref FROM Produits", dbOpenDynaset)
...
Cette procédure déclenche son
code VBA au
chargement du formulaire. A ce stade, non savons forcément qu'aucune opération d'écriture n'a encore été entreprise. Donc, le pointeur est initialisé sur la bonne ligne. C'est ensuite, au gré des ajouts, qu'il doit progresser.
Ajouter une ligne au tableau de la facture
Maintenant, avant d'
écrire dans la facture, il est tout d'abord opportun de vérifier qu'une ligne existe bien, pour recevoir la nouvelle entrée. S'il s'agit du premier ajout, aucun problème ne se pose. Une ligne vierge existe déjà . Mais pour les suivantes, la
facture doit s'étoffer au fil des achats. Et c'est la
variable laLigne qui donne le feu vert lorsque sa valeur est
supérieure à 2, signifiant qu'au moins une entrée a déjà été réalisée.
- Dans les bornes de la procédure Valider_Click, ajouter l'instruction conditionnelle suivante :
...
If (laLigne > 2) Then
ActiveDocument.Tables(1).Cell(laLigne - 1, 5).Select
Selection.InsertRowsBelow 1
End If
...
A l'occasion d'une précédente
astuce VBA Word, nous avions appris l'utilité de la
propriété Tables de l'
objet ActiveDocument. Elle renvoie la
collection des tableaux présents sur le document en cours. Ici, nous le savons, il n'y en a qu'un. C'est la raison pour laquelle nous pointons dessus en passant le chiffre 1, en paramètre de cette propriété. Ensuite, hiérarchiquement, nous descendons jusqu'à ses cellules grâce à l'
objet enfant Cell. Cet
objet permet de définir une cellule précisément en spécifiant son
indice de ligne ainsi que son
indice de colonne. Nous pointons sur la
dernière colonne du tableau (5) et sur la
ligne en cours, aussi étonnant que cela puisse paraître avec cette notation (laLigne - 1). En effet, le code n'est pas terminé. Nous le verrons, après chaque ajout, nous
incrémenterons cette
variable. Si bien qu'au clic suivant, elle désignera la ligne suivante qui n'a pas encore été créée. C'est alors la
méthode Select qui permet de sélectionner cette cellule. Comme nous le ferions à la souris sur le document, une cellule ou une ligne doit explicitement être sélectionnée pour procéder à une insertion au-dessus ou en-dessous. Dès lors, c'est la
méthode InsertRowsBelow appliquée sur l'
objet Selection, donc sur la
cellule activée, qui permet de
créer une nouvelle ligne en-dessous de l'actuelle.
Nouvelle écriture dans la facture
Sur cette
nouvelle ligne, il s'agit maintenant d'inscrire les informations attendues dans les
cinq cellules. Ces informations ne sont autres que celles contenues dans les
champs du formulaire à l'exception d'un calcul à réaliser pour le
montant hors taxes. C'est bien sûr toujours l'
objet Cell de la
collection Tables qui permet d'atteindre ces cellules. Comme l'
objet parent et sa
collection vont être répétés à cinq reprises, nous proposons de dégainer un
bloc With. Comme nous l'avons appris, il permet de regrouper les instructions dans une branche de code optimisé, pour ne pas répéter inutilement les mêmes objets.
- A la suite du code, créer le bloc With suivant :
...
With ActiveDocument.Tables(1)
.Cell(laLigne, 1).Range.Text = Ref.Value
.Cell(laLigne, 2).Range.Text = Nom.Value
.Cell(laLigne, 3).Range.Text = Qte.Value
.Cell(laLigne, 4).Range.Text = Prix.Value
.Cell(laLigne, 5).Range.Text = Prix.Value * Qte.Value
End With
...
Nous pointons donc sur
chaque cellule de la
ligne en cours en spécifiant les indices de colonne respectifs. C'est la
propriété Range qui permet de descendre jusqu'au contenu représenté par la
propriété enfant Text. Ces contenus, nous les affectons aux valeurs détenues par les contrôles respectifs du formulaire. Seule la dernière cellule reçoit un calcul comme nous l'avons annoncé. Il s'agit de la
multiplication du
prix unitaire par la
quantité achetée. C'est ainsi que nous en déduisons le
montant total hors taxe pour l'article en cours.
Passer à la ligne suivante
Nous en avons presque terminé. Mais avant de quitter la procédure, la
variable laLigne doit être
incrémentée. En effet, puisqu'un nouvel article vient d'être ajouté, elle doit pointer sur la
ligne suivante, en vue d'un potentiel nouvel ajout au prochain clic. Et c'est cette
incrémentation qui explique la
décrémentation entreprise dans l'
instruction conditionnelle, comme nous l'avons expliqué précédemment.
- A la suite du code, ajouter les deux nouvelles instructions suivantes :
...
laLigne = laLigne + 1
Qte.Value = 1
...
Par la même occasion, nous en profitons pour réinitialiser la valeur de la quantité afin que l'opérateur n'insère pas la précédente quantité par mégarde.
Créer une nouvelle facture
Il est temps de vérifier l'impact de cette avancée offerte par ce
code VBA.
- Enregistrer les modifications (CTRL + S) et exécuter le formulaire (F5),
- Avec la liste déroulante, choisir une référence,
- Dans la zone de la quantité, saisir une valeur numérique,
- Puis, cliquer sur le bouton Ajouter,
Comme vous pouvez le voir, la première écriture est ajoutée à la facture, avec tout son détail, sur la ligne qui existait déjà .
- Choisir une nouvelle référence,
- Définir une nouvelle quantité,
- Puis, cliquer de nouveau sur le bouton Ajouter,
Une nouvelle ligne est désormais automatiquement ajoutée pour recevoir le nouvel article acheté. Et vous l'avez sans doute remarqué, le montant total est parfaitement calculé en bout de ligne. Si vous ajoutez de nouveaux articles, vous continuez d'implémenter la facture sans difficulté.
Bien sûr, il nous reste du chemin à parcourir. Nous devons encore produire le total de la facture. Nous devons aussi vérifier que tous les champs du formulaire sont renseignés avant l'ajout d'un nouvel article. Nous devons confronter la quantité voulue avec la quantité disponible en stock. Enfin, nous devons
mettre à jour les stocks dans la
base de données Access et
éditer la facture PDF à l'issue. Toutes ces solutions, nous les développerons à l'occasion des volets à suivre.