formateur informatique

Remplir la facture avec un formulaire VBA Word

Accueil  >  Bureautique  >  Word  >  Word VBA  >  Remplir la facture avec un formulaire VBA Word
Livres à télécharger


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


Inscription Newsletter    Inscription Newsletter
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.

Formulaire Word de facturation affiché sur ouverture du document

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é.

Construire la facture sur un document Word grâce à un formulaire VBA

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.

 
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