formateur informatique

Facturation avec interface graphique VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Facturation avec interface graphique VBA Excel


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

Pour l'intégrer sur votre site internet ou blog, vous pouvez l'embarquer :

Vous pourriez aussi être intéressé(e) par :
Distributeur de billets en Visual Basic Excel
Encrypter et décrypter des données en Vba Excel
Débuter avec VBA Excel et la programmation
Gérer les conditions et critères en VBA Excel
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 Facture Excel pour formulaire gestion de stocks VBA

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,
Insertion formulaire en VBA Excel

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,
Affichage formulaire graphique VBA sur feuille Excel

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,
Code qui se déclenche sur événement ouverture classeur Excel

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 :
Boîte outils pour ajouter contrôles sur le formulaire VBA
  • 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é auformulaire, 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,
Procédure événementielle activation du formulaire VBA

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 <> ''

Wend


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)
ligne = ligne + 1


Remplissage automatique liste déroulante au chargement formulaire VBA
  • 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()
Dim ligne As Integer: ligne = 2

While ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> ''
liste_ref.AddItem (ThisWorkbook.Worksheets('articles').Cells(ligne,3).Value)
ligne = ligne + 1
Wend

ThisWorkbook.Worksheets('facturation').Activate
End Sub


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()

End Sub


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

End If


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
MsgBox ('La quantité saisie n'est pas un nombre, veuillez corriger')
Exit Sub
Else

End If


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 :
Références articles avec Stocks pour facturation VBA Excel

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 <> '')
If (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value = liste_ref.SelText) Then

End If
ligne = ligne + 1
Wend


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
MsgBox 'La quantité en stock pour cette référence n'est que de ' & ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value
Exit Sub
Else

End If


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 <> '')
lignef = lignef + 1
Wend


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
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5).Value = quantite.Value
  • Exécuter le code (F5),
  • Ajouter quelques articles avec des quantités valides,
Construction automatique de la facture Excel avec le formulaire VBA

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()
Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6

If (liste_ref.SelText <> '') Then
If (IsNumeric(quantite.Value) = False) Then
MsgBox ('La quantité saisie n'est pas un nombre, veuillez corriger')
Exit Sub
Else
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')
If (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value = liste_ref.SelText) Then
If (Int(quantite.Value) > Int(ThisWorkbook.Worksheets('articles').Cells(ligne,6).Value)) Then
MsgBox 'La quantité en stock pour cette référence n'est que de ' & ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value
Exit Sub
Else
While (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '')
lignef = lignef + 1
Wend
ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value = liste_ref.SelText
ThisWorkbook.Worksheets('facturation').Cells(lignef, 5).Value = quantite.Value
End If
End If

ligne = ligne + 1
Wend
End If
End If
End Sub


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
Range('C6:C26').Value = ''
Range('E6:E26').Value = ''


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
Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6


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)
If (reponse = 6) Then

End If


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 <> '')
lignef = lignef + 1
Wend


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
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')
ligne = ligne + 1
Wend


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
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value = ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value - ThisWorkbook.Worksheets('facturation').Cells(lignef, 5)
End If


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.

Facturation et gestion de stocks automatisés avec formulaire VBA Excel

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()
Dim reponse As Byte
Dim ligne As Integer: ligne = 2
Dim lignef As Integer: lignef = 6

reponse = MsgBox('Souhaitez-vous valider la facture et mettre à jour les stocks', vbYesNo + vbQuestion)

If (reponse = 6) Then
While (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3).Value <> '')
ligne = 2
While (ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value <> '')

If (ThisWorkbook.Worksheets('facturation').Cells(lignef, 3) = ThisWorkbook.Worksheets('articles').Cells(ligne, 3).Value) Then
ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value = ThisWorkbook.Worksheets('articles').Cells(ligne, 6).Value - ThisWorkbook.Worksheets('facturation').Cells(lignef, 5)
End If
ligne = ligne + 1
Wend
lignef = lignef + 1
Wend

End If

Label1.Caption = 'Les stocks ont été mis jour. La facture peut être éditée.'

End Sub




 
Sur Facebook
Sur G+
Sur Youtube
Contact
Mentions légales