Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Contrôler les stocks
Dans cette cinquième et avant-dernière étape de la construction de l'
application de facturation automatisée en 
VBA Word, nous souhaitons nous assurer que les 
quantités en stocks sont suffisantes, avant d'autoriser l'
ajout d'articles à la facture. Mais ce n'est pas tout, une fois l'article accepté et ajouté, sa référence et sa quantité achetées doivent être insérées dans la 
table prévue à cet effet dans la 
base de données Access. C'est ainsi que nous préparerons le terrain pour la sixième et dernière étape. Son objectif sera de 
mettre à jour les stocks dans la 
table d'origine, grâce à ces informations temporaires.
Document Word et base Access à télécharger
Pour poursuivre ces travaux, nous devons tout d'abord récupérer l'
application de facturation au dernier indice de développement.
Après décompression et comme nous en avons l'habitude désormais, nous retrouvons le 
document Word, la 
base de données Access et le 
sous dossier pour 
archiver les factures.
- Double cliquer sur le document pour l'ouvrir dans Word,
- Cliquer sur les boutons des bandeaux de sécurité pour libérer les ressources,
- Puis, cliquer sur la croix du formulaire qui apparaît pour le Fermer,
- Ensuite, réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Word,
Supprimer les enregistrements de la table temporaire
Nous l'avons évoqué, si les 
stocks sont suffisants, l'achat de l'article doit être accepté. En conséquence, ses informations doivent être insérées en 
table temporaire en vue de la 
mise à jour des stocks lors de la 
validation de la facture. Donc, à chaque 
nouvelle facturation, cette 
table temporaire doit tout d'abord être vidée des anciennes données émanant d'une précédente 
facture. Et souvenez-vous, nous l'avions découverte à l'occasion du premier volet, cette 
table temporaire se nomme 
tempProduits.
- Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Facturation,
- Puis, double cliquer sur un emplacement vide du formulaire en conception,
Nous basculons ainsi dans la 
feuille de code entre les bornes de la 
procédure UserForm_Activate. Son code se déclenche au 
chargement du formulaire. Et comme vous pouvez le voir, des 
objets de base de données (enr et base) existent déjà. Nous les avions programmés à l'occasion du premier volet pour questionner la 
base de données Access et remplir la liste déroulante des références articles. Souvenez-vous de même que leur implémentation a été rendue possible grâce à l'
ajout au projet d'une 
référence à Access.
Bref, nous allons pouvoir les exploiter, en tous cas l'un d'entre eux, pour 
exécuter une requête Suppression sur la 
table temporaire.
- Sous la boucle Do, ajouter les deux instructions VBA suivantes :
...
Do
Ref.AddItem enr.Fields("produit_ref").Value
enr.MoveNext
Loop Until enr.EOF
requete = "DELETE * From tempProduits"
base.Execute requete
enr.Close
base.Close
Set enr = Nothing
Set base = Nothing
...
Ainsi, nous réexploitons notre 
objet de base de données, juste avant qu'il ne soit fermé (base.Close). Nous avions déclaré la 
variable requete par anticipation. Nous lui affectons une syntaxe bien particulière. Elle consiste à supprimer (DELETE) tous les enregistrements (*) de tous les champs dans (From) la 
table tempProduits. Et c'est simplement la 
méthode Execute de l'
objet de base de données qui permet de déclencher cette 
requête Suppression dont la syntaxe lui est passée en paramètre.
Vérifier la quantité en stock
Maintenant et pour poursuivre, nous devons confronter la 
quantité demandée pour un article à sa 
quantité disponible en 
stock. C'est seulement lorsque la première est inférieure à la seconde que la commande de la référence peut être ajoutée à la facture. Et pour réaliser cette vérification, rien n'est plus simple. En effet, grâce à nos développements précédents, cette 
quantité est déjà rapatriée sur le 
formulaire dans le 
champ nommé 
Stock. Le 
champ de la quantité commandée est quant à lui nommé 
Qte.
- Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Facturation,
- Sur le formulaire en conception, double cliquer sur le bouton Ajouter,
Ainsi, nous retournons dans la feuille de code, mais cette fois entre les bornes de la 
procédure événementielle Valider_Click. Notre test doit intervenir après un premier test existant. Il s'agit de celui que nous avons monté à l'occasion du développement précédent pour vérifier que toutes les zones de saisie étaient bien renseignées. C'est seulement à cette condition que le processus d'ajout peut être entrepris. Mais désormais, nous allons lui additionner une seconde sécurité.
- Dans l'instruction conditionnelle de la variable booléenne, créer l'instruction suivante :
...
Next Zone
If test = True Then
If (CInt(Qte.Value) <= CInt(Stock.Value))Then
If (laLigne > 2) Then
'Sélectionner avant d'insérer en-dessous
ActiveDocument.Tables(1).Cell(laLigne - 1, 5).Select
Selection.InsertRowsBelow 1
End If
total = total + Prix.Value * Qte.Value
...
Nous exploitons la 
fonction VBA CInt pour 
forcer la conversion des contenus des zones de texte en 
valeurs entières. Lorsqu'un calcul est entrepris sur ces valeurs comme une multiplication, le 
VBA comprend et réalise cette conversion naturellement. Ici, nous devons nous en charger. Donc, nous autorisons la suite du traitement si et seulement si la 
quantité demandée est 
inférieure ou égale à la 
quantité en stock.
Cette nouvelle 
instruction conditionnelle doit maintenant être bornée. Et comme elle est encapsulée dans un premier test, cette 
borne de fin doit intervenir avant le 
else du 
premier If. C'est ainsi que l'
ajout d'un article à la facture ne pourra se faire que selon deux conditions. Le 
formulaire doit être 
complètement rempli et la 
quantité en stock doit être 
suffisante.
- Avant le Else du premier If, ajouter la branche de fin comme suit :
...
laLigne = laLigne + 1
Qte.Value = 1
Else
MsgBox "La quantité en stock n'est pas suffisante pour ce produit."
End If
Else
MsgBox "Tous les renseignements ne sont pas complétés"
End If
End Sub
...
Comme nous l'avons fait précédemment, nous affichons une indication à l'utilisateur dans une boîte de dialogue grâce à la 
fonction MsgBox.
Mémoriser les quantités achetées
Nous n'en avons pas fini avec les améliorations à apporter à cette 
procédure Valider_Click. Nous l'avons évoqué, si l'article est accepté, sa 
quantité commandée doit être inscrite en 
table temporaire, accompagnée de sa 
référence bien sûr. C'est ainsi que la 
mise à jour des stocks pourra opérer la correspondance. Et pour cela, dans la branche de l'instruction conditionnelle que nous venons de bâtir, nous proposons d'
appeler une procédure qui se chargera de réaliser l'
insertion. Cette 
procédure n'existe pas encore. Nous la créerons a posteriori.
- Juste après le bloc With, ajouter l'appel suivant :
...
.Cell(laLigne + 4, 5).Range.Text = total * 1.2
End With
memoriser Ref.Value, Qte.Value
laLigne = laLigne + 1
Qte.Value = 1
Else
MsgBox "La quantité en stock n'est pas suffisante pour ce produit."
End If
Else
...
Le 
bloc With est en effet celui qui procède à l'inscription des informations de l'article ajouté à la 
facture. Nous appelons donc la 
fonction memoriser. C'est avec ce nom que nous devrons la créer. Et nous lui passons l'information sur la 
référence et la 
quantité achetée en arguments. Elle a en effet besoin de connaître les informations à 
insérer dans la table. Nous devrons donc signer la 
procédure memoriser avec ces 
deux paramètres en attente.
- Sous la procédure Valider_Click, créer maintenant la procédure memoriser comme suit :
Sub memoriser(Ref As String, nb As Byte)
End Sub
Comme prévu, nous la signons donc avec les deux variables attendues en paramètres, respectivement pour la 
référence de l'article et sa 
quantité achetée.
C'est une nouvelle 
requête action que nous devons désormais entreprendre mais cette fois d'
ajout. Pour l'exécuter, au même titre que la 
requête suppression précédente, nous avons besoin d'une 
variable pour mémoriser la 
syntaxe Sql, d'un 
objet de base de données et d'une 
variable pour stocker le 
chemin d'accès à la 
base de données.
- Dans les bornes de la procédure memoriser, ajouter les déclarations et affectations suivantes :
...
Dim cheminBd As String: Dim requete As String
Dim base As Database
cheminBd = ThisDocument.Path & "\articles.accdb"
Set base = DBEngine.OpenDatabase(cheminBd)
...
Nous l'avons évoqué à plusieurs reprises à l'occasion des volets précédents, c'est la 
propriété Path de l'
objet ThisDocument qui renseigne sur le 
chemin d'accès au projet local. Nous lui concaténons le 
nom de la base de données, sans oublier l'
antislash (\) en préfixe pour bien entrer dans le dossier. Dès lors nous 
instancions la classe permettant d'hériter des 
propriétés et méthodes pour piloter les 
objets de base de données. Et pour cela, nous exploitons la 
méthode OpenDatabase de l'
objet DBEngine en lui passant le 
chemin de la Bdd en paramètre. C'est ainsi que l'
objet base peut désormais piloter la 
base de données articles.accdb par le 
code VBA.
Nous allons donc exploiter cet 
objet de base de données pour exécuter la 
requête Ajout. Mais avant cela, faut-il encore construire la syntaxe de la 
requête Sql.
- A la suite du code de la procédure, ajouter les deux instructions VBA suivantes :
...
requete = "Insert Into TempProduits (produit_ref, produit_stock) VALUES ('" & Ref & "'," & nb & ")"
base.Execute requete
...
Nous entreprenons donc une classique 
requête Insert Into sur la 
table TempProduits. Dans les premières parenthèses, nous énumérons les champs à renseigner. Dans les secondes, après l'
instruction VALUES, nous renseignons les valeurs à y inscrire. Mais comme il s'agit de 
variables, nous devons les concaténer (&). Et comme la première, celle de la 
référence, est un 
texte, nous devons l'encadrer de 
côtes, d'où l'alternance 
très importante à respecter de 
simples et de doubles côtes. Ensuite et comme précédemment, nous appliquons la 
méthode Execute sur la 
base de données, avec la 
requête Sql en paramètre. Nous devrions donc constater l'insertion automatique des données de l'article acheté, à chaque référence insérée 
au clic sur le 
bouton Ajouter du 
formulaire.
Comme toujours et pour coder proprement, nous devons 
fermer cet objet de base de données puis le 
détruire, pour 
libérer la mémoire de l'ordinateur.
- A la suite du code de la procédure, ajouter les deux dernières instructions suivantes :
...
base.Close
Set base = Nothing
...
Il est temps de réaliser quelques essais. 
- Enregistrer les modifications (CTRL + S) et exécuter l'application (F5),
- Avec le formulaire qui surgit, ajouter quelques références à la facture,
- Puis, à la racine du dossier de décompression, double cliquer sur la base articles.accdb,
- Dans le volet de navigation, double cliquer alors sur la table TempProduits pour l'ouvrir,

Nous accédons ainsi à la vue en 
mode feuille de données de la 
table. Et comme vous pouvez l'apprécier, toutes les 
références que nous avons ajoutées à la 
facture sont effectivement accompagnées de leurs 
quantités respectives.
- Fermer la table en cliquant sur la croix de son onglet,
- Revenir sur Word et fermer le formulaire en cliquant sur la croix de sa fenêtre,
- Exécuter de nouveau l'application en enfonçant la touche F5 du clavier,
- Puis, rouvrir la table Access,

La sécurité est bel et bien en place puisqu'à chaque nouvelle 
facturation entreprise, la 
table temporaire est initialement 
vidée pour procéder à une potentielle nouvelle 
mise à jour des stocks.