Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Distributeur de billets - Résoudre des équations en VBA
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
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,
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 ,
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,
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 ,
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,
Enfoncer la touche F5 du clavier pour exécuter le formulaire VBA ,
Cliquer sur plusieurs boutons,
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.
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 premier
If 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 .
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 ,
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.
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.