formateur informatique

Distributeur de billets en Visual Basic Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Distributeur de billets en Visual Basic 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 :
Facturation avec interface graphique VBA Excel
Boucles For Next en VBA Excel pour traitements automatisés
Gérer les conditions et critères en VBA Excel
Boucle d'instruction For Each en VBA Excel
Distributeur de billets - Résoudre des équations en VBA

Distributeur automatique de billets, interface graphique VBA Excel



Dans cette formation, nous proposons de réaliser une application qui simule le retrait de billets à un distributeur automatique (DAB). Le distributeur possède un stock de billets de 10, 20 et 50 Euros. Le client tape le montant qu'il souhaite retirer par le biais de boutons sur une interface graphique (UserForm), que nous allons concevoir. Le distributeur doit alors fournir cette somme en combinant les billets. Il va s'agir d'équation à résoudre. Une fois le retrait effectué, le stock de billets doit être mis à jour. Nous verrons que certaines combinaisons sont impossibles à réaliser quand le stock des petites coupures est insuffisant ou lorsque le montant demandé est supérieur au total en banque.

Le classeur du stock en banque Stocks billets banque dans feuille Excel pour guichet automatique VBA

Nous partons d'une feuille dépouillée, la feuille bank. Elle fournit les informations de stock respectivement en cellules B3, B6 et B9. C'est le contenu de chacune de ces cellules qui doit être mis à jour par le code VBA, une fois le retrait réalisé. Tout le reste de l'application doit être créé.

Distributeur de billets - L'interface graphique
Pour simuler le DAB et interagir avec le client de la banque, nous allons concevoir une interface graphique avec un UserForm. La formation Facturation avec interface graphique VBA Excel montre comment créer et piloter ces UserForm.
  • Basculer dans l'éditeur de code Visual Basic par ALT + F11 par exemple,
  • Cliquer alors sur le menu Insertion en haut de la fenêtre,
  • Puis, choisir UserForm dans la liste,
Création formulaire UserForm en Visual Basic Excel

Nous allons placer des contrôles sur ce formulaire grâce à la petite boîte à outils qui s'affiche lorsque ce dernier est actif. Nous avons besoin d'un premier contrôle Label (Intitulé) pour afficher un message au client. Nous avons besoin d'un second Label pour afficher le montant tapé par le client sur le clavier numérique. Enfin, nous avons besoin de 12 boutons. Les 10 premiers permettent de taper un chiffre de 0 à 9. Les deux derniers permettent respectivement de valider ou annuler la transaction. Mais avant cela, nous allons personnaliser l'interface graphique grâce à la fenêtre Propriétés située en bas à gauche de l'écran. Si elle n'est pas visible, passez par le menu Affichage. Cette fenêtre liste les propriétés du contrôle sélectionné sur le UserForm. Pour l'instant, seule notre interface est active, nous allons donc pouvoir la personnaliser en modifiant les valeurs de ses propriétés.
  • Régler sa propriété (Name) sur distributeur,
Un objet se pilote par son nom en programmation donc, nous lui attribuons un nom explicite.
  • Régler sa propriété Width sur 320 et sa propriété Height sur 240,
Width et Height permettent de définir respectivement la largeur et la hauteur du UserForm. Lorsque vous modifiez ces valeurs, vous remarquez que le formulaire change de dimensions au centre de l'écran.
  • Saisir Distributeur automatique de billets pour sa propriété Caption,
Le propriété Caption permet de définir le texte qui apparaît dans la barre de titre du formulaire.
  • Choisir une couleur de fond plutôt chaleureuse à l'aide de la liste déroulante de la propriété BackColor,
Propriétés du formulaire VBA Excel, paramétrer interface graphique

La couleur de fond du formulaire s'adapte instantanément. Lorsque vous déroulez cette propriété, des couleurs par défaut sont proposées ainsi que des cases de couleur blanche en bas de la liste. Si vous réalisez un clic droit sur ces dernières, vous affichez une palette RVB qui vous permet de définir précisément la couleur de votre choix. Nous allons maintenant placer les contrôles nécessaires à l'interaction avec le client de la banque.
  • Cliquer sur le UserForm pour l'activer et ainsi afficher la boîte à outils,
  • Choisir le contrôle Intitulé (A) dans cette boîte à outils,
  • Le tracer sur la largeur du formulaire et sur environ un tiers de sa hauteur en partant du bord supérieur du UserForm,
  • Taper msg dans sa propriété (Name),
  • Dans sa propriété Caption, saisir le texte : Veuillez saisir le montant de la transaction à réaliser,
  • Choisir de nouveau le contrôle Intitulé (A) dans la boîte à outils,
  • Le tracer sous le précédent, sur la largeur du formulaire et sur une petite hauteur suffisante pour afficher le montant de la transaction,
  • Taper txt_montant dans sa propriété (Name),
  • Vider sa propriété Caption,
Les autres propriétés de ces deux contrôles sont communes. Ainsi, nous allons pouvoir définir la police, la couleur et la taille du texte en une fois.
  • Sélectionner le premier contrôle (msg) en cliquant dessus,
  • Tout en maintenant la touche CTRL enfoncée, cliquer sur le second (txt_montant),
  • Dans la fenêtre Propriétés, régler le BackColor sur du noir,
  • Régler le ForeColor sur un gris très clair proche du blanc,
La propriété ForeColor définit littéralement la couleur de premier plan, donc du texte pour ces contrôles.
  • Régler la propriété TextAlign sur 2 - fmTextAlignCenter,
  • Cliquer sur le petit bouton à trois points de la propriété Font pour la police,
  • Définir la police sur Courier New par exemple, sa taille sur 22 et son style sur Gras,
  • Valider ces réglages en cliquant sur Ok,
Personnaliser contrôles du formulaire graphique VBA Excel avec fenêtre Propriétés

Nous allons maintenant créer les douze boutons en commençant par le premier que nous allons configurer avec des attributs. Ainsi, en le répliquant, les autres récupèreront ces réglages. Il ne restera qu'à changer leur nom et intitulé.
  • Cliquer sur le contrôle Bouton de commande depuis la boîte à outils,
  • Tracer un carré sur la gauche du formulaire, en dessous de l'intitulé txt_montant,
  • Taper un dans sa propriété (Name) et saisir 1 dans sa propriété Caption,
  • A l'aide de sa propriété Font, définir sa police sur Courier New et sa taille sur 16,
  • Régler sa propriété BackColor sur un gris foncé,
  • Régler sa propriété ForeColor sur un gris clair,
  • Dupliquer ce bouton en le cliquant et le glissant à l'aide de la touche CTRL enfoncée,
  • Nommer cette copie deux et régler son Caption sur 2,
  • Dupliquer cette copie de la même façon en lui attribuant le nom trois et le Caption 3,
  • Réitérer cette opération jusqu'aux boutons V et C présentés sur la capture ci-dessous,
  • Pour ces deux derniers boutons, les nommer respectivement valider et annuler,
  • Enfin, toujours pour ces deux derniers boutons, passer leur texte en gras avec la propriété Font,
Boutons de formulaire pour interaction utilisateur en VBA Excel

Chacun de ces boutons doit ajouter dans l'intitulé txt_montant, le texte qu'il porte. Ainsi, s'il est déjà écrit 2 et que nous cliquons sur le bouton 0, nous devons obtenir 20. Nous devons donc concaténer (&) le texte déjà présent avec celui que nous ajoutons. C'est la propriété Caption d'un contrôle bouton, comme nous le savons déjà, qui renvoie le texte porté par le bouton. Et c'est la même propriété Caption d'un contrôle intitulé qui désigne l'information saisie dans le contrôle. Donc, lorsque nous cliquons sur le bouton 0, le code suivant doit être déclenché : txt_montant.Caption = txt_montant.Caption & zero.Caption. Ce code doit intervenir sur un évènement précis, celui du clic sur le bouton. Pour ce genre de contrôle, c'est l'évènement par défaut.
  • Double cliquer sur le bouton 1 depuis le UserForm,
Vous basculez dans l'éditeur de code entre les bornes de la procédure un_Click(). Les instructions saisies entre ces bornes se déclencheront donc au clic sur le bouton 1.
  • Saisir la ligne de code permettant d'ajouter la valeur du bouton dans l'intitulé,
  • Réitérer l'opération pour chacun des boutons numériques en adaptant le nom des contrôles,
Code Visual Basic Excel déclenché sur événement clic sur bouton de formulaire

  • Enfoncer la touche F5 du clavier pour exécuter le formulaire VBA,
  • Cliquer sur plusieurs boutons,
Formulaire du DAB, guichet automatique de billets en VBA Excel

Vous devez constater que le montant s'assemble et apparaît au centre du formulaire. Dans notre cas, nous avons d'abord cliqué sur le bouton 4 puis sur le 9 et enfin sur le 0. C'est le résultat de la concaténation par la ligne de code : txt_montant.Caption = txt_montant.Caption & zero.Caption. A la saisie déjà présente (txt_montant.Caption = txt_montant.Caption), nous ajoutons (&) la valeur portée par le bouton cliqué (zero.Caption). Tout fonctionne parfaitement à ce stade. Nous allons maintenant préparer les boutons V et C. Le bouton V est celui qui réalise tout le traitement. C'est son code qui devra résoudre l'équation permettant de fournir une combinaison de billets dont le total correspond au montant demandé par le client de la banque. Le bouton C en revanche doit réaliser une commande très simple, en fermant le formulaire pour annuler l'opération.
  • Stopper l'exécution du formulaire en cliquant sur sa croix en haut à droite de sa fenêtre,
  • De retour dans l'éditeur de code, afficher le formulaire en double cliquant dessus depuis l'explorateur de Projet,
  • Puis, double cliquer sur le bouton C afin de créer la procédure qui lancera l'exécution du code au clic sur ce bouton,
Il s'agit ici d'écrire la ligne de code permettant de fermer le formulaire pour annuler la transaction et stopper l'exécution. L'objet concerné est le formulaire reconnu par son nom, distributeur. La méthode d'un formulaire permettant de le fermer est la méthode Hide.
  • Saisir la ligne de code distributeur.Hide,
  • Enfoncer la touche F5 pour exécuter le formulaire,
  • Cliquer sur le bouton C,
C'est parfait, le formulaire se ferme et l'exécution du code se stoppe. Dernier réglage avant de développer le code principal du bouton V, nous devons faire en sorte que le formulaire s'affiche automatiquement à l'ouverture du classeur. Il s'agit d'une astuce que nous avons déjà apprise avec le support de formation sur la facturation automatisée avec VBA Excel. La méthode d'un objet formulaire permettant de l'afficher est la méthode Show, soit distributeur.Show. Pour que ce code se déclenche au moment de l'ouverture du classeur, il doit être écrit dans la procédure événementielle correspondante. Pour cela :
  • Double cliquer sur ThisWorkbook depuis l'explorateur de Projet,
  • En haut de sa page de code, avec la première liste déroulante, choisir l'objet Worbook,
La procédure Workbook_Open() se crée automatiquement. Tout code saisi entre ses bornes se déclenche en même temps que le classeur s'ouvre. Open est l'événement par défaut associé à l'objet Workbook. La liste déroulante de droite permet de choisir d'autres événements construisant d'autres procédures événementielles, déclenchant les codes saisis dans d'autres circonstances.
Déclencher actions Visual Basic sur événement ouverture classeur Excel
  • Saisir la ligne de code distributeur.Show entre ces bornes,
  • Enregistrer le travail (CTRL + S),
  • Fermer le classeur puis le rouvrir pour effectuer le test,
Le formulaire s'affiche par défaut au-dessus de la feuille du classeur comme nous le souhaitions.
  • Fermer le formulaire et revenir dans l'éditeur de code,
L'équation des billets de banque pour résoudre le montant
Le client saisit un montant par le biais du formulaire représentant le guichet automatique. Appelons cette variable montant. Une combinaison des trois billets et de leur quantité respective doit atteindre ce montant pour que le distributeur soit en mesure de fournir la quantité exacte de billets aux clients. Nous connaissons la valeur des billets mais pas encore leur quantité. Appelons ces inconnues respectivement x pour les billets de 50, y pour les billets de 20 et z pour les billets de 10. L'équation à résoudre est donc la suivante : z * 10 + y * 20 + x * 50 = montant. Nous devons trouver toutes les combinaisons possibles de quantités de billets pour arriver au montant demandé. A l'issue, nous devons fournir une solution au client correspondant aux quantités en stock de billets. Par exemple, si le client demande 130 Euros, nous pouvons lui fournir 2 billets de 50, 1 billet de 20 et 1 billet de 10. 1 * 10 + 1 * 20 + 2 * 50 = 130. Mais s'il ne reste plus qu'un seul billet de 50 en stock, alors nous devrons lui offrir une autre combinaison comme par exemple : 1 billet de 50 et 4 billets de 20 : 0 * 10 + 4 * 20 + 1 * 50 = 130. Mais s'il ne reste plus que 3 billets de 20 en stock, alors nous pourrions lui proposer la solution suivante : 2 * 10 + 3 * 20 + 1 * 50 = 130. Voilà donc comment doit raisonner le programme. Et plus le montant grandira, plus le nombre de combinaisons sera conséquent. Alors, plutôt que de chercher à tout prévoir grâce à des instructions If, nous allons utiliser l'imbrication de boucles. Cette astuce nous permettra de faire varier toutes les inconnues du problème. Et à chaque fois que l'équation sera vérifiée, le programme devra s'assurer que les quantités proposées sont en stock. Si c'est le cas, le client n'aura plusqu'à retirer ses billets. Ensuite les stocks seront mis à jour.
  • Afficher le formulaire par le biais de l'explorateur de Projet,
  • Double cliquer sur le bouton V pour basculer entre les bornes de sa procédure de code,
  • Réaliser les déclarations de variables suivantes :
Dim a_max As Integer: Dim b_max As Integer: Dim c_max As Integer
Dim nb_10 As Integer: Dim nb_20 As Integer: Dim nb_50 As Integer
Dim montant As Integer: Dim critere As Boolean: Dim total_banque As Integer


Le mot clé Dim sert à débuter la déclaration d'une variable. Le mot clé As est utilisé pour annoncer le type auquel on l'associe. La formation sur les variables en VBA Excel enseigne toutes ces notions en détail.

a_max, b_max et c_max sont des variables que nous utiliserons pour faire varier les valeurs des variables z, y et x afin de tenter de résoudre l'équation. Il s'agit de valeurs numériques. Elles sont donc déclarées comme des entiers : Integer. Nous les initialiserons à leur valeur seuil qui sera définie en fonction du montant demandé par le client. nb_10, nb_20 et nb_50 sont les variables qui vont respectivement permettre de mémoriser la quantité en stock de chaque billet. Donc, nous les initialiserons en fonction des valeurs contenues dans les cellules correspondantes de la feuille bank. La variable montant sera utilisée pour mémoriser la valeur demandée par le client. Elle sera donc initialisée et affectée à la valeur contenue dans le contrôle intitulé du formulaire. La variable critere permettra de savoir si l'équation a été résolue ou non. C'est pourquoi son type est Boolean. Elle ne peut prendre que deux valeurs, Vrai ou Faux. Quand elle basculera à Vrai, nous stopperons l'exécution pour fournir les billets au client. La variable total_banque sera utilisée pour mémoriser la somme totale disponible en banque. Si la somme demandée dépasse ce total, un message négatif sera adressé au client et l'exécution stoppera.



Le total en banque doit réaliser la multiplication de chaque quantité de billets par leur valeur et sommer ces trois résultats. Les quantités de billets de 10, 20 et 50 se trouvent respectivement en B3, B6 et B9. Une cellule se désigne en VBA par l'objet Cells en lui fournissant les indices numériques de ligne et de colonne, soit respectivement : Cells(3,2), Cells(6,2) et Cells(9,2). Et c'est la propriété Value de l'objet Cells qui retourne le contenu de chaque cellule. Donc nous pourrions écrire : total_banque = Cells(3, 2).Value * 10 + Cells(6,2).Value * 20 + Cells(9, 2).Value * 50.

Mais comme il existe plusieurs feuilles sur ce classeur, nous devons le préciser dans le code avec l'objet Worksheets de la façon suivante par exemple : Worksheets('bank').Cells(3,2).Value.
  • Ajouter la ligne de code permettant de mémoriser la valeur totale disponible en banque :
total_banque = Worksheets('bank').Cells(3, 2).Value * 10 + Worksheets('bank').Cells(6, 2).Value * 20 + Worksheets('bank').Cells(9, 2).Value * 50

Maintenant que nous savons récupérer le contenu des cellules pour les stocker dans des variables, nous allons pouvoir affecter les variables des quantités de billets.
  • Saisir les trois lignes de code pour l'affectation des variables nb_10, nb_20 et nb_50,
nb_10 = Int(Worksheets('bank').Cells(3, 2).Value)
nb_20 = Int(Worksheets('bank').Cells(6, 2).Value)
nb_50 = Int(Worksheets('bank').Cells(9, 2).Value)


Ensuite, avant de réaliser le traitement, nous devons faire deux vérifications. La première consiste à savoir si l'utilisateur a bien saisi un montant. Dans le cas contraire, un message doit lui être adressé afin de l'encourager à reprendre la saisie avant de valider. La seconde consiste à savoir si le montant demandé n'est pas supérieur au total en banque. Dans ce cas en effet, le guichet automatique doit décliner la demande. Ces vérifications se font grâce à l'instruction If en VBA. La formation VBA Excel sur les critères et conditions présente cette instruction de façon détaillée et explicite.
  • A la suite du code, ajouter les bornes suivantes pour l'instruction If :
If(IsNumeric(txt_montant.Caption)) Then
'Le montant saisi doit être numérique et entier
Else
End If


Nous utilisons la fonction IsNumeric() pour tester la contenu de l'intitulé txt_montant. Elle retourne Vrai (True) si le contenu de l'objet testé est bien un nombre et Faux (False) dans le cas contraire, quand la saisie est vide par exemple. Si le client a bien saisi un montant, un traitement correpodant doit être réalisé entre le If et le Esle. Le Else signifie sinon. Donc le code traitant le cas où la saisie du montant est vide doit être écrit entre le Else et le End If. End et If sont les deux mots clés qui permettent de terminer une instruction If en VBA. Lorsque la saisie est bien numérique, nous devons mémoriser le montant demandé dans la variable montant. Puis nous devons réaliser un second test pour savoir si ce montant n'est pas supérieur au total en banque. Donc nous devons utiliser une seconde instruction If à l'intérieur de la première.
  • Dans la première branche du If avant le Else, ajouter le code suivant :
montant = txt_montant.Caption
If (montant > total_banque) Then

End If


Nous stockons donc le montant demandé (montant). Puis nous vérifions qu'il n'est pas supérieur au plafond disponible (If (montant > total_banque)). Si c'est le cas, nous devons en informer l'utilisateur et mettre fin à l'exécution du programme. Le MsgBox en VBA permet d'afficher une boîte de dialogue avec un message personnalisé destiné à l'utilisateur.
  • A l'intérieur de ce second If, ajouter les instructions suivantes :
MsgBox 'Le montant total disponible en banque est seulement de : ' & total_banque & '. Veuillez définir un autre montant.'
txt_montant.Caption = ''
Exit Sub

Dans un premier temps, nous affichons l'information à l'écran par le biais du MsgBox. Ensuite, comme la demande ne peut pas être honorée, nous réinitialisons la valeur demandée à l'écran par le client (txt_montant.Caption = ''). Puis nous arrêtons l'exécution en sortant du programme à l'aide de l'instruction Exit Sub. Le traitement du Else du premierIf est identique. Il consiste à demander à l'utilisateur de bien vouloir saisir un montant puis stoppe l'exécution du programme.
  • Dans le Else du premier If, ajouter les instructions similaires suivantes :
MsgBox 'Veuillez saisir un montant numérique'
txt_montant.Caption = ''
Exit Sub
  • Enfoncer la touche F5 du clavier pour exécuter le formulaire,
  • Saisir un montant supérieur au total en banque, par exemple 9000,
  • Cliquer sur le bouton V pour valider la demande,
Le message que nous avons codé dans le second If se déclenche invitant l'utilisateur à revoir ses ambitions à la baisse. Lorsque vous validez ce MsgBox en cliquant sur Ok, l'intitulé du montant se vide (txt_montant.Caption ='') et le programme s'arrête (Exit Sub). Mais la saisie peut instantanément reprendre et l'exécution redémarrer en cliquant de nouveau sur le bouton V.
Simulation de distributeur automatique de billets avec formulaire VBA Excel
  • Fermer le formulaire en cliquant sur sa croix,
  • Enfoncer la touche F7 du clavier pour afficher le code de ce dernier,
Si le code passe ces tests cela signifie d'une part qu'un montant a été saisi et d'autre part qu'il n'est pas supérieur au total en banque. La demande peut donc être traitée. Il est temps de faire intervenir l'imbrication des boucles pour résoudre l'équation à trois inconnues. Nous devons commencer par initialiser certaines variables.
  • Ajouter les affectations suivantes à la suite du code :
critere = False
c_max = Int(montant / 50): b_max = Int(montant / 20): a_max = Int(montant / 10)


Nous fixons tout d'abord la variable booléenne à Faux (critere = False). Lorsque nous aurons trouvé une solution à la requête du client, nous affecterons cette variable à True. Ce critère nous permettra d'indiquer au programme qu'il n'est plus nécessaire de poursuivre et que les stocks des billets doivent être mis à jour. Pour résoudre l'équation, nous choisissons de faire varier les trois inconnues. Comme il y a trois inconnues, nous allons utiliser une triple boucle. L'objectif est de répondre à la demande du client en tentant d'atteindre le montant à l'aide des plus gros billets, les billets de 50 dans un premier temps. Chaque boucle incrémente ou décrémente une variable entre une borne supérieure et une borne inférieure. Pour chaque boucle, nous connaissons la borne inférieure, il s'agit de 0. La quantité supérieure est le nombre maximum de billets qu'il faut réunir pour atteindre le montant demandé. Par exemple si le client demande 210 Euros, nous savons qu'il faudra 4 billets de 50. Au-delà le montant est dépassé. 210/50=4,2. La partie entière de ce résultat est donc 4. C'est pourquoi nous initialisons la quantité maximale des billets de 50 à la partie entière de cette division (c_max = Int(montant / 50)). Et nous faisons de même pour les autres billets. Nous tentons d'atteindre ce montant avec uniquement les billets de chaque groupe afin d'obtenir la valeur maximale possible pour la borne supérieure de la boucle (b_max =Int(montant / 20): a_max = Int(montant / 10)). Encore une fois, nous utilisons les deux points (:) dans la syntaxe VBA afin d'affecter plusieurs variables sur une même ligne. Nous devons maintenant écrire la triple boucle.
  • Ajouter l'imbrication suivante des trois boucles :
For x = c_max To 0 Step -1
For y = b_max To 0 Step -1
For Z = a_max To 0 Step -1

Next Z
Next y
Next x


L'objectif est d'atteindre le résultat le plus rapidement possible, donc en partant des plus gros billets, avec la quantité maximale de ces billets. Donc nous écrivons la boucle qui fait varier la quantité des billets de 50 en partant de la plus grande valeur possible, jusqu'à la quantité 0. Pour ce faire, nous utilisons le mot clé Step qui permet de réaliser une décrémentation (For x = c_max To 0 Step -1). Ces itérations sont abordées en détail par le support de formation VBA sur les boucles For Next. Et pour chacune de ces quantités de billets de 50, nous faisons varier à l'intérieur, les quantités de billets de 20 (For y = b_max To 0 Step -1). Par exemple, pour le montant de 210, nous sommes sur la quantité 4 des billets de 50. Quelle que soit la valeur des billets de 20, la montant ne peut pas être atteint. Par contre, si nous étions dans le deuxième passage de la première boucle (3 billets de 50), la quantité 3 pour les billets de 20 permettrait d'atteindre le résultat. Donc si les stocks en banque le permettaient, nous pourrions déjà fournir une solution au client. Mais il nous reste à traiter les billets de 10. Pour chaque quantité de billets de 50 et pour chaque quantité de billets de 20, nous faisons varier toutes les quantités possibles de billets de 10 (For Z = a_max To 0 Step -1). Par exemple, pour le premier passage dans la boucle x, la quantité vaut 4, nous sommes à 200 Euros. Et pour le dernier passage dans la boucle y, la quantité des billets de 20 vaut 0, donc nous sommes toujours à 200 Euros. Et pour l'avant dernier passage dans la boucle Z, la quantité des billets de 10 vaut 1, donc nous sommes à 210 Euros et la solution est trouvée (1 * 10 + 0 * 20 + 4 * 50 = 210). Dans ces conditions, la variable critere doit être affectée à True pour indiquer au programme d'arrêter l'itération.

Donc, dans cette triple boucle, nous devons réaliser un test à l'aide d'une instruction If afin de savoir si l'équation est résolue. Cela signifie que cette équation doit être vérifiée pour chaque valeur de quantité qui change.
  • Dans la triple boucle, ajouter le code qui permet de vérifier l'équation :
If (Z * 10 + y * 20 + x * 50 = montant) Then

End If


Si cette équation est vérifiée, nous devons d'abord nous assurer que les quantités de billets disponibles en banque sont en adéquation. Par exemple, pour le montant de 210 Euros, la combinaison de 4 billets de 50 et d'un billet de 10 est correcte. Mais si la quantité disponible de billets de 50 en banque n'est plus que de 3, nous ne pouvons pas proposer cette option au client. La variable critere ne passe pas à true, les stocks ne sont pas mis à jour. L'itération doit se poursuivre pour proposer une autre combinaison de billets.

Donc dans ce If, nous devons imbriquer une autre vérification de critère qui consiste à valider que toutes les quantités proposées par la combinaison, sont inférieures ou égales aux quantités de billets en stock.
  • Dans les bornes de l'instruction If, ajouter ce nouveau critère :
If (Z <= nb_10 And y <= nb_20 And x <= nb_50) Then

End If


En revanche, si ce second critère est vérifié, nous savons que la quantité est viable. Nous devons donc en avertir le client avec un MsgBox par exemple afin qu'il récupère ses billets. Et nous en profitons pour basculer la variable de test à True.
  • Dans le second If, ajouter les deux lignes de code correspondantes :
MsgBox 'Vous allez recevoir - Billets de 10 :' & Z & ' - Billets de 20 : ' & y & ' - Billets de 50 : ' & x
critere = True


Puis, nous devons mettre à jour les stocks de billets disponibles après ce retrait. Il faut soustraire la quantité de chaque billet ayant résolu l'équation à la valeur initiale en stock, mémorisée respectivement en cellules B3, B6 et B9. Pour ce faire, toujours dans le second If :
  • Ajouter les trois lignes de code permettant la mise à jour des stocks de billets :
Worksheets('bank').Cells(3,2).Value = Worksheets('bank').Cells(3, 2).Value - Z
Worksheets('bank').Cells(6,2).Value = Worksheets('bank').Cells(6, 2).Value - y
Worksheets('bank').Cells(9,2).Value = Worksheets('bank').Cells(9, 2).Value - x


Et comme une solution a été trouvée, il n'est pas nécessaire de poursuivre la lecture des boucles. Pour en sortir nous utilisons l'instruction Exit For.
  • Ajouter cette instruction, à la suite du code, toujours dans le second If,
Le Exit For permet de sortir d'une boucle. Or il y en a trois. Cela signifie qu'à chaque passage dans chacune des boucles, il faut réaliser le critère qui permet de déterminer si l'itération doit se poursuivre ou non. Et c'est là qu'intervient enfin la variable critere. Si elle est à True, elle doit indiquer d'arrêter le traitement des boucles parents. Il faut donc ajouter le test à la fin de chacune des deux boucles restantes. Au final, le code de la triple boucle permettant la résolution de l'équation, est la suivante :

For x = c_max To 0 Step -1
For y = b_max To 0 Step -1
For Z = a_max To 0 Step -1
If (Z * 10 + y * 20 + x * 50 = montant) Then
If (Z <= nb_10 And y <= nb_20 And x <= nb_50) Then
MsgBox 'Vous allez recevoir - Billets de 10 : ' & Z & ' - Billets de 20 : ' & y & ' - Billets de 50 : ' & x
critere = True
Worksheets('bank').Cells(3, 2).Value = Worksheets('bank').Cells(3, 2).Value - Z
Worksheets('bank').Cells(6, 2).Value = Worksheets('bank').Cells(6, 2).Value - y
Worksheets('bank').Cells(9, 2).Value = Worksheets('bank').Cells(9, 2).Value - x
Exit For
End If
End If
Next Z
If (critere = True) Then
Exit For
End If

Next y
If (critere = True) Then
Exit For
End If

Next x


Il nous reste à traiter le cas où aucune solution n'a été trouvée car les quantités de billets disponibles en stock ne permettent pas de réaliser la combinaison viable. Ce cas se présente lorsque le traitement intégral des boucles est terminé et que la variable critere est toujours à False.
  • Après les trois boucles et avant le End Sub, ajouter le dernier test comme suit :
If (critere = False) Then
MsgBox 'Nous sommes désolés, il n'existe aucune combinaison avec les billets disponibles pour votre demande'
End If


Il ne nous reste plus qu'à tester l'application.
  • Enfoncer la touche F5 du clavier,
  • Saisir un montant avec les boutons du formulaire, par exemple 930 et cliquer sur V,
Distributeur automatique de billets VBA Excel, équation résolue

Le programme, après avoir résolu l'équation grâce à la triple boucle, propose une solution de combinaison de billets dont le montant est équivalent à celui demandé par le client de la banque. Cette proposition s'affiche à l'écran via une boîte de dialogue MsgBox. Lorsque vous la validez, vous remarquez que les stocks de billets de la feuille bank, sont instantanément mis à jour en conséquence. L'exécution du programme s'arrête alors immédiatement grâce au critère passé à true, qui permet d'enclencher l'instruction Exit For afin de sortir de l'itération de chacune des trois boucles imbriquées. C'est ce même critère, lorsqu'il reste à False qui permet de déterminer, à l'issue du traitement des boucles, qu'aucune solution n'a été trouvée pour résoudre l'équation. Bien que chacune des boucles ait fait varier toutes les valeurs possibles pour chaque inconnue, aucune solution n'a été trouvée en corrélation avec la quantité de billets disponibles en stock.
Guichet automatique VBA Excel, combinaison de billets impossible

Dans l'exemple de la capture ci-dessus, il reste un billet de 10, un billet de 20 et deux billets de 50. Le client demande à retirer 90 Euros. Ce montant n'est pas supérieur à celui disponible en banque. Donc l'exécution du programme se poursuit et les boucles sont enclenchées pour tenter de résoudre l'équation. Cependant, aucune combinaison de billets ne permet d'atteindre cette valeur. En effet les montants les plus proches qui peuvent être atteints sont respectivement 80 Euros (1 billet de 50 + 1 billet de 20 + 1 billet de 10) et 100 Euros (2 billets de 50). Donc le programme en informe le client. Les billets ne lui sont pas restitués et les stocks ne sont pas mis à jour. Le programme fonctionne parfaitement.
 
Sur Facebook
Sur G+
Sur Youtube
Contact
Mentions légales