Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer : 
Facturation clients avec interface graphique VBA Excel 
Ce que nous proposons de réaliser ici est un mini 
logiciel  ou 
progiciel  pour 
facturer  les clients à l'aide d'une 
interface  utilisateur conçue en 
VBA Excel .
Le classeur de facturation 
Il s'agit d'une 
facturation  automatisée et dynamique réalisée au titre de la 
formation sur la fonction Decaler()  pour adapter les formules des plages de cellules en fonction de leur contenu évolutif. La 
liste déroulante  permet de choisir un code article sur la base du catalogue de la feuille articles. Si le catalogue évolue avec de nouvelles références, la 
liste déroulante  les intègre car elle est conçue sur une plage de cellules qui s'ajuste au contenu grâce à la 
fonction Decaler() . Les Désignations et prix unitaires sont importés automatiquement en fonction de cette référence grâce à la fonction 
RechercheV() . Elle aussi s'ajuste au contenu évolutif du catalogue grâce à la 
fonction Decaler()  qui lui permet de réaliser la recherche dans un tableau qui peut évoluer. Il ne reste plus à l'utilisateur qu'à saisir les quantités achetées pour que les montants de la facture se calculent automatiquement. Comme vous le remarquez, il s'agit d'un classeur classique (
xlsx ). Cela signifie qu'il ne gère pas les 
macros  et donc le code 
VBA . Or nous souhaitons programmer une vraie mini-application. Nous devons donc enregistrer ce classeur au format 
xlsm .
Cliquer sur Fichier  en haut à gauche de la fenêtre Excel , 
Choisir ensuite Enregistrer sous  puis Parcourir , 
Dans la zone Type , choisir l'extension *.xlsm  puis cliquer sur Enregistrer , 
Cette 
facturation  est presque parfaite sauf qu'elle ne permet pas de 
gérer les stocks . Elle n'empêche pas de vendre un article en 
rupture de stock  ou dont la quantité est trop importante. Elle ne permet pas non plus de mettre à jour les quantités de 
stocks  après la validation de la 
facture . C'est ce que nous proposons de réaliser avec une 
interface utilisateur graphique  en 
VBA Excel . L'utilisateur doit pouvoir sélectionner une référence depuis l'
interface  et définir la quantité à acheter. Si la quantité demandée est supérieure à celle présente en 
stock , l'utilisateur en est averti et il ne peut pas ajouter l'article à la 
facture . Dans le cas contraire, un bouton permet d'insérer une nouvelle ligne de facturation, mémorisant les informations pour pouvoir mettre à jour les 
stocks  lorsqu'à l'issue, l'utilisateur valide la facture et confirme ainsi l'achat.
L'interface graphique en VBA Excel 
Cette interface graphique se nomme un 
UserForm . Ce 
Userform  doit se charger à l'ouverture du classeur de manière à ce que l'utilisateur n'ait pas accès à la feuille directement. Toute la 
facturation  doit se gérer depuis l'
interface .
Basculer dans l'éditeur Visual Basic  à l'aide du raccourci clavier ALT + F11  par exemple, 
Cliquer ensuite sur le menu Insertion  puis choisir UserForm , 
Le 
UserForm  apparaît au centre de la fenêtre. En bas à gauche, se situe la fenêtre de 
propriétés  de l'objet sélectionné au centre, soit le 
UserForm  à ce stade. Cette fenêtre permet de régler l'objet, le contrôle, l'interface ainsi sélectionnée pour modifier son apparence notamment.
Dans la fenêtre Propriétés, régler la propriété (Name)  sur facture , 
Régler la propriété Height  sur 250 et Width  sur 300, 
Par défaut ces 
propriétés  sont rangées par ordre alphabétique. La propriété 
Height  permet de modifier la hauteur de l'objet tandis que 
Width  influe sur sa largeur.
Choisir une couleur de fond pour l'interface avec la propriété BackColor , 
Modifier le texte de la barre de titre de l'interface en : Facturation Clients , à l'aide de la propriété Caption , 
Régler la propriété KeepScrollBarsVisible  sur 0 – fmScrollBarsNone , 
Les barres de défilement ainsi n'apparaîtront pas sur l'
interface . Les dimensions que nous avons définies suffiront à afficher l'ensemble des 
contrôles  nécessaire pour cette 
application de facturation .
Modifier la police de l'interface avec la propriété Font , 
Changer la propriété ForeColor  avec l'onglet Palette qui se propose, ForeColor  désigne la couleur de premier plan. Il s'agit de la couleur qui sera affectée par défaut aux textes et contrôles que nous ajouterons sur l'interface.
Cliquer sur le Userform  au centre de la fenêtre pour l'activer et enfoncer la touche F5  du clavier pour l'afficher en mode exécution, 
Comme vous le remarquez, le 
UserForm  s'affiche au-dessus de la feuille du classeur, la feuille 
facturation  en l'occurrence ici. Cette 
interface  apparaît dans une fenêtre qui dispose par défaut de toutes les propriétés des fenêtres Windows classiques. Ainsi vous pouvez la déplacer en la cliquant et la glissant depuis sa barre de titre. Vous pouvez la fermer en cliquant sur sa croix rouge.
Fermer l'interface utilisateur, 
L'exécution se stoppe et vous êtes de retour dans l'
éditeur Visual Basic  sur le 
UserForm . Nous souhaitons que cette 
interface  se déclenche automatiquement à l'ouverture du classeur. Le 
UserForm  est un 
objet  qui possèdent des 
propriétés  comme nous venons de le voir. Et comme l'enseigne la 
formation pour débuter en VBA Excel , tout objet a aussi des 
méthodes . Ces 
méthodes  permettent de réaliser des actions, comme ouvrir ou afficher le 
formulaire . La 
méthode  du 
UserForm  pour ce faire est la 
méthode Show  qui s'appelle par le nom de l'
objet , 
facture  ici, tel que nous l'avons modifié par la 
fenêtre propriété . La ligne de code est donc la suivante : 
facture.Show . Mais ce code doit être associé à un 
évènement , pour qu'il se déclenche automatiquement. Nous souhaitons qu'il se déclenche à l'ouverture du classeur. Il est très simple en 
VBA Excel  de connaître les 
évènements  disponibles attachés aux feuilles et classeurs.
Double cliquer sur l'objet ThisWorkbook  dans la fenêtre Projet  sur la gauche de l'éditeur, 
L'
objet ThisWorkbook  désigne le classeur sur lequel nous sommes en train de travailler, littéralement, ce classeur.
Régler la liste de droite au-dessus de la page de code sur Open , 
La procédure 
Private Sub Workbook_Open()  est ainsi créée. Il s'agit de l'
évènement Open  (Ouvrir) associé à 
ThisWorkbook  (Ce classeur). Concrètement, tout 
code  écrit entre les bornes de cette procédure se déclenchera automatiquement à l'ouverture du classeur. Il ne reste donc plus qu'à écrire la ligne de 
code  permettant d'afficher le 
UserForm facture .
Ajouter la ligne : facture.Show , entre les bornes de la procédure, 
Enregistrer le travail (CTRL + S ), 
Fermer le classeur puis le rouvrir. 
Vous remarquez en effet que l'
interface graphique  se déclenche automatiquement à l'ouverture du classeur en se positionnant au-dessus de la feuille.
Fermer l'interface pour revenir dans le code . Les contrôles de formulaire 
Pour que l'utilisateur puisse gérer intégralement la 
facturation  depuis l'
interface graphique , nous devons ajouter plusieurs 
contrôles . Il faut une 
liste déroulante  pour lui permettre de choisir une référence à acheter. Il faut une 
zone de saisie  pour qu'il puisse définir la quantité achetée pour cette référence. Il faut une 
zone de texte  (Label) pour communiquer avec lui, de manière à par exemple lui indiquer que le stock ne permet pas un achat d'une telle quantité. Enfin, il faut trois 
boutons . Un 
bouton  pour ajouter la référence avec sa quantité sur la 
facture . Il faut un 
bouton  pour lui permettre de réinitialiser la 
facture  en cas d'erreur. Et enfin il faut un 
bouton  pour valider la 
facture , commander l'aperçu avant impression et mettre à jour les 
stocks  en fonction de ces nouveaux achats. A l'aide de la 
boîte à outils  qui s'affiche lorsque vous sélectionnez le 
formulaire  :
Ajouter comme le propose la capture, une liste déroulante , 
La nommer liste_ref  à l'aide de sa propriété (Name)  de la fenêtre Propriétés , 
Ajouter au-dessus un contrôle Intitulé  (Label), 
Modifier son texte en : Choisir une référence  à l'aide de sa propriété Caption , 
Ajouter une zone de texte  et définir son nom sur quantite , 
Juste au-dessus, ajouter un intitulé en réglant son texte sur Définir une quantité , 
En dessous, ajouter un nouvel intitulé  avec comme texte Message utilisateur ! , 
Ajouter un premier bouton  avec le nom ajouter  et le texte Ajouter , 
Ajouter un deuxième bouton  avec le nom reinitialiser  et le texte Réinitialiser , 
Ajouter un dernier bouton  avec le nom valider  et le texte Valider la facture , Le code associé aux événements 
Comme nous l'avons vu précédemment, les 
codes  que nous allons développer doivent être attachés à des 
événements . Ainsi un clic sur un bouton déclenchera le code qui est écrit entre les bornes de la procédure gérant l'
événement  associé au clic sur ce bouton. Mais avant cela, lorsque l'
interface  s'affiche, elle doit proposer par le biais de la 
liste déroulante , tous les codes articles présents dans le catalogue. Donc la 
liste déroulante  doit se charger de ses données en même temps que le 
formulaire  s'active. L'événement associé est 
activate .
Depuis l'éditeur Visual Basic , double cliquer sur un emplacement vide du UserForm , 
Vous basculez dans le 
code  attaché au
formulaire , entre les bornes de la procédure 
UserForm_Click() . Le 
code  écrit entre ces bornes se déclencherait donc au clic sur le 
formulaire . Ce n'est pas cet événement qui nous intéresse, mais l'
événement Activate() .
Dans la liste de droite, en haut de la page de code, choisir Activate , 
Le code écrit dans les bornes de cet 
événement  s'exécutera en même temps que le 
formulaire  s'active, donc qu'il s'affiche. Pour remplir cette 
liste déroulante , nous avons besoin de parcourir la colonne des codes articles de la feuille articles, en partant de la ligne 2 et tant que la cellule n'est pas vide. Donc il faut déclarer une variable que nous nommerons 
ligne  et l'initialiser à 2. Pour plus d'informations, vous pouvez vous référer à la 
formation sur la déclaration de variables en VBA Excel .
Ajouter la déclaration  et affectation  suivantes dans les bornes de la procédure, Dim ligne As Integer: ligne = 2 
Il s'agit de parcourir les codes articles de la feuille articles. 
ThisWorkbook  est l'
objet VBA Excel  qui désigne le classeur actif. Sa 
propriété Worksheets  avec en paramètre le nom de la feuille, permet de désigner une feuille précise du classeur. Pour parcourir tous les codes articles, ligne à ligne, tant que la cellule n'est pas vide pour les insérer dans la 
liste déroulante  du 
formulaire , nous devons utiliser une 
boucle . La 
boucle  qui permet de parcourir des éléments tant qu'une condition est vérifiée, est la 
boucle While  en 
VBA Excel . La 
formation VBA Excel sur les boucles For Next  aborde ces 
boucles While . Une 
boucle While  doit se terminer par le mot clé 
Wend . Le critère à poser juste après le 
While , consiste à vérifier que la cellule de la colonne 3 (C) n'est pas vide, signifiant qu'elle porte un code article.
Ajouter l'instruction While  comme suit : While ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '' 
La variable ligne doit être incrémentée à chaque passage pour pouvoir ainsi scruter chaque cellule de la colonne 3, tant qu'elle n'est pas vide. C'est l'
objet Cells()  qui désigne une cellule avec son indice de ligne et son indice de colonne en paramètre. La 
propriété Value  de ce dernier renvoie son contenu qui doit être différent d'un contenu vide (<> ''). Dans la 
boucle , il s'agit maintenant d'ajouter à la 
liste déroulante , chaque code article ainsi trouvé. Le nom de notre 
objet liste déroulante  est 
liste_ref . La 
méthode  qui permet d'ajouter des éléments à cet 
objet  est 
AddItem  avec en argument, la valeur à ajouter, celle de la cellule. Il ne faut pas ensuite oublier d'
incrémenter  la 
variable ligne . En effet, si la 
boucle While  tourne sans passer à la ligne suivante, le 
critère  sera toujours vérifié et la 
boucle  ne se terminera jamais. On parle de 
boucle infinie .
Dans les bornes de la boucle, ajouter les deux lignes de code suivantes : liste_ref.AddItem(ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value) 
Enfoncer la touche F5  pour tester le code . 
Le 
formulaire  apparaît. Si vous déroulez la liste, vous remarquez qu'elle propose tous les codes articles du Catalogue. Et comme c'est une 
boucle While  qui s'en charge, si vous faites évoluer le catalogue en ajoutant des références à la suite, la 
liste déroulante  les proposera.
Ajouter enfin la ligne suivante afin de se placer sur la feuille facturation au démarrage : ThisWorkbook.Worksheets('facturation').Activate 
Le code complet que nous avons écrit est le suivant :
Private Sub UserForm_Activate() 
Après avoir sélectionné une référence, l'utilisateur doit définir la quantité achetée dans la zone de saisie située sur la droite. Pour mâcher le travail, nous allons régler la valeur par défaut à 1 pour cette zone de saisie.
Fermer le formulaire en cliquant sur sa croix, 
Sélectionner la zone de saisie quantite  sur le formulaire  en mode conception, 
Régler sa propriété Value  sur 1  à l'aide de la fenêtre Propriétés , 
Le prochain 
code  que nous devons écrire doit être associé à l'
événement  du clic attaché au 
bouton ajouter . Ce 
code  doit premièrement vérifier que la quantité saisie est bien un 
nombre  pour éviter l'
incompatibilité de type , auquel cas le programme planterait. Ensuite, il doit comparer la référence article et la quantité demandée avec celle en 
stock  dans le catalogue pour cet article. Si la quantité demandée est inférieure ou égale, le code article et la quantité doivent être insérés dans la 
facture , sinon un message doit alerter l'utilisateur sur le fait que le 
stock  n'est pas suffisant.
Sur le formulaire  en mode conception, double cliquer sur le bouton ajouter , 
Vous basculez ainsi dans l'éditeur de code entre les bornes de la procédure suivante :
Private Sub ajouter_Click() 
Il s'agit de la procédure gérant l'
événement  du clic sur le 
bouton ajouter . Cela signifie que tout 
code  écrit entre ces bornes se déclenchera au clic sur ce bouton. Le premier 
critère  à vérifier est de savoir si l'utilisateur a bien sélectionné une référence à l'aide de la 
liste déroulante . C'est 
l'instruction If() en VBA Excel  qui permet de poser des 
conditions  et d'engager des actions selon le cas. La 
propriété SelText  pour un 
objet liste modifiable , 
liste_ref  ici, renvoie le texte sélectionné dans la liste. Cette 
propriété  ne doit pas être vide.
Dans la procédure du bouton, ajouter l'instruction If()  suivante : If(liste_ref.SelText <> '') Then 
Si ce 
critère  est vérifié, le programme doit continuer. Si la saisie de la quantité n'est pas un nombre, nous devons en avertir l'utilisateur par un 
MsgBox()  puis arrêter l'exécution du programme (
Exit Sub ). C'est la propriété 
Value  d'un 
objet  zone de saisie (
quantite  ici) qui renvoie son contenu. Dans le cas contraire (
else ), tout est en ordre, nous poursuivons.
Imbriquer le deuxième critère If()  à l'intérieur du premier : If (IsNumeric(quantite.Value) = False) Then 
Nous devons maintenant nous assurer que les 
stocks  sont suffisants. Si c'est le cas, nous devons inscrire la référence et la quantité demandée sur la 
facture . Ce 
code  doit donc être écrit dans la branche 
else  du 
if() . Mais avant cela, comme précédemment, nous devons déclarer et affecter une variable 
ligne , en début de procédure. C'est elle, dans la 
boucle While  qui nous permettra de parcourir les références du catalogue à la recherche du 
stock  correspondant.
Ajouter la déclaration  suivante au début de la procédure du bouton : Dim ligne As Integer: ligne = 2 
Notre catalogue ne possède pas d'information sur les 
stocks . Nous allons lui ajouter une colonne permettant de les gérer.
Revenir sur la feuille articles, 
Ajouter une colonne Stocks  au tableau comme l'illustre la capture ci-dessous : 
De retour dans le 
code , entre le 
If  et le 
End If  de l'instruction 
If() imbriquée  :
Ajouter la boucle While  permettant de parcourir les références du catalogue tout en vérifiant (avec une nouvelle instruction If) si la référence est celle choisie sur l'interface. While(ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '') 
Si c'est le cas, nous devons encore 
imbriquer  un nouveau 
test  de manière à verifier si le 
stock  permet l'ajout de l'article. Dans le cas contraire, l'utilisateur doit en être averti et l'exécution du code stoppée.
Ajouter cette nouvelle instruction If()  à l'intérieur du test imbriqué : If (Int(quantite.Value) > Int(ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value)) Then 
Si la quantité demandée par l'utilisateur est supérieure à celle disponible en 
stock  (If (Int(quantite.Value) > Int(Cells(ligne, 6).Value))). Alors (Then), nous en avertissons l'utilisateur (MsgBox) et nous stoppons le programme (Exit Sub). Dans le cas contraire (Else), nous devons ajouter l'article et sa quantité sur la facture, puis sortir de la boucle puisqu'une fois la référence trouvée, il n'est plus nécessaire de continuer de parcourir le catalogue. Nous avons de nouveau besoin d'une variable à déclarer pour parcourir les cellules des codes articles de la facture. Dès qu'une cellule vide sera détectée, signifiant qu'aucune référence n'est insérée, nous utiliserons cette cellule pour intégrer le nouveau code article.
Au début de la procédure du bouton, ajouter la ligne suivante : Dim lignef As Integer: lignef = 6 
Lignef  est la variable que nous allons utiliser pour parcourir les lignes de la facturation.
Dans le Else  du dernier If  imbriqué, ajouter les lignes suivantes : While (ThisWorkbook.Worksheets('facturation').Cells(lignef,3).Value <> '') 
En partant de la ligne 6, nous déplaçons l'indice de la ligne (lignef = lignef + 1) jusqu'à trouver la première cellule vide de la colonne des codes article, de manière à pouvoir y insérer la nouvelle référence. Donc, une fois la boucle terminée, la variable 
lignef  doit porter l'indice de la première cellule dans laquelle nous pouvons saisir. Il s'agit de la colonne 3 pour la référence et de la colonne 5 pour la quantité. La feuille étant activée, nous utilisons l'objet 
Cells  avec ces indices pour y inscrire les nouvelles données. Pour ce faire :
Ajouter le code suivant, après le While  et avant le End If  : ThisWorkbook.Worksheets('facturation').Cells(lignef,3).Value = liste_ref.SelText 
Exécuter le code (F5 ), 
Ajouter quelques articles avec des quantités valides, 
A chaque fois que vous cliquez sur le bouton Ajouter, vous remarquez que la nouvelle ligne de 
facturation  se crée à la suite des autres. Les fonctions 
RechercheV  récupèrent les informations correspondant au code article ainsi inséré. Les formules réalisent les calculs de la 
facture  avec la quantité intégrée automatiquement. Tout se fait par le 
formulaire VBA , plus aucune saisie sur la feuille n'est nécessaire. De plus la 
facturation  est sécurisée par le 
contrôle des stocks  en amont grâce au 
code . Le code complet du bouton 
ajouter  associé à l'
événement Click  est le suivant :
Private Sub ajouter_Click() 
Le bouton Réinitialiser 
Ce bouton consiste à supprimer tous les codes article et quantités de manière à purger la 
facture  en cas d'erreur.
Afficher le UserForm  en conception, 
Double cliquer sur le bouton reinitialiser , 
Vous créez ainsi la procédure 
Sub reinitialiser_Click() , soit le code qui se déclenche au clic sur ce bouton.
Dans les bornes de cette procédure, ajouter les trois lignes suivantes : ThisWorkbook.Worksheets('facturation').Activate 
Nous activons premièrement la feuille sur laquelle nous souhaitons supprimer les données insérées. Comme nous connaissons les plages strictes des colonnes 
Code article  et 
Quantité , nous les désignons avec l'objet 
Range . La propriété 
Value  permet de désigner le contenu de chaque cellule à l'intérieur de cette plage que nous réinitialisons à '', soit un contenu vide.
Mise à jour des stocks 
Le dernier bouton doit permettre de valider la 
facture  en mettant les 
stocks  à jour selon les quantités achetées. Nous allons parcourir les références de la 
facture  avec une boucle 
While . A l'intérieur de cette 
boucle , c'est-à-dire pour chaque référence de la 
facture , nous allons les comparer aux références du catalogue avec une autre 
boucle While  imbriquée. Lorsque les références correspondront, nous soustrairons les quantités pour 
mettre à jour les stocks .
En mode conception, double cliquer sur le bouton valider , 
Ajouter les trois lignes de déclarations et d'affectations suivantes : Dim reponse As Byte 
La variable 
reponse  déclarée comme un entier court servira à enregistrer la réponse de l'utilisateur à la question posée via un 
MsgBox . Un clic sur un bouton renvoie en effet une valeur entière. Comme toujours les deux autres variables vont permettre de parcourir les lignes des deux feuilles.
Poursuivre avec le code proposé ci-dessous : reponse = MsgBox('Souhaitez-vous valider la facture et mettre à jour les stocks', vbYesNo + vbQuestion) 
Le 
Msgbox  permet de demander à l'utilisateur s'il souhaite poursuivre. Comme on lui associe deux boutons de choix (vbYesNo), la boîte de dialogue renvoie une valeur en fonction du bouton cliqué, que nous stockons dans la variable 
reponse . S'il clique sur Oui (If (reponse = 6)), alors (Then), nous devons engager la double boucle qui permettra de 
mettre à jour les stocks . Il faut commencer par parcourir tous les codes article de la facture. Pour ce faire,
Ajouter la boucle While  suivante : While(ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '') 
Puis, pour chaque code article de la facture, il faut parcourir tous les codes articles du catalogue afin de les comparer. Pour ce faire :
Ajouter la boucle While imbriquée  comme suit : ligne = 2 
Avant d'entrer dans cette 
boucle While , nous n'oublions pas de réinitialiser la valeur de la variable 
ligne  à 2, car cette 
boucle  doit repartir de ce point pour chaque code article de la 
facture , c'est-à-dire à chaque passage dans la première 
boucle . Pour 
mettre à jour les stocks  :
Ajouter le test If()  dans le While  comme suit : If(ThisWorkbook.Worksheets('facturation').Cells(lignef, 3) = ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value) Then 
Si les références de la facture et du catalogue correspondent, alors nous mettons à jour le 
stock  du catalogue pour cette référence en lui soustrayant la quantité achetée. Il ne reste plus qu'à en informer l'utilisateur en lui adressant un message de confirmation, cette fois par l'intermédiaire du label (Label1) que nous avions placé sur le formulaire.
Ajouter cette dernière ligne de code : Label1.Caption = 'Les stocks ont été mis à jour. La facture peut être éditée.' 
Exécuter le code (F5), 
Ajouter plusieurs articles et cliquer sur Valider la facture. 
Vous remarquez d'une part que la facture se construit parfaitement et automatiquement et d'autre part que les stocks sont mis à jour en fonction des quantités achetées. Le code complet pour ce bouton est le suivant :
Private Sub valider_Click()