You are on page 1of 5

Petite gestion des stocks

Comment quelques macros et du code VBA facilitent la gestion des donnes dans des feuilles de calcul Excel
Vous avez demand quelques tudiants de BTS de grer le stock des cartouches dencre associ aux imprimantes de la section TS de votre tablissement. On dispose du classeur encre.xls qui prsente 2 feuilles : Mouvements et Stock Activez la feuille stock, via longlet en bas de lcran La feuille stock contient les donnes relatives aux stocks de cartouches en dbut de priode et en fin de priode, cette dernire donne devra tre actualise automatiquement pour tenir compte des sorties de stock et des entres (livraisons). Enregistrer une macro qui permettra datteindre la feuille Mouvements et datteindre la cellule C6 Outils > Macro > Nouvelle macro > Nom : vers_maj (cest dire : vers feuille mise jour du stock)

Outils > Macro > VBEditor pour voir le code gnr

Fermez ensuite VB Editor ou basculez vers le classeur encre.xls Revenez sur la feuille Stock pour mettre en place un bouton qui permettra dactiver la macro Affichez la barre doutils permettant linsertion de bouton Affichage > Barre doutils > formulaire Slectionnez loutil bouton et dessinez le bouton dans la feuille Choisir le nom de la macro excuter lorsque lon cliquera sur le bouton

Iufm Champagne Ardenne J. Bresson VBA Exemple2

page 1/1

Renommez ensuite le libell du bouton (<Ctrl> + Clic pour le slectionner en vitant dactiver la macro)

Dans la feuille stock donnez le nom listearticles la plage de cellules A8 :A18 (on utilisera la commande Insertion > Nom > Dfinir) afin de pouvoir y faire rfrence dans la feuille mouvements . Remarque : lutilisation dun nom pour cette liste prsente un intrt : en cas dajout de nouveaux articles le nom prendra en compte les cellules ajoutes. Utilisez le bouton pour revenir la feuille mouvements qui permettra de constater les entres ou sorties de stock. Compltez la feuille Mouvements La cellule B6 recevra date de lopration La cellule C6 reoit une liste de validation (Donnes > Validation)

Selon un principe voisin, la cellule D6 reoit une liste de validation diffrente, limite deux donnes immuables : Entre ou Sortie

Enregistrez votre travail et saisissez une premire sortie de stock Sortie de 3 units de Deskjet 890 n&b

Iufm Champagne Ardenne J. Bresson VBA Exemple2

page 2/2

Bien entendu, le stock de ces cartouches na pas t modifi pour autant ! Il serait donc intressant de pouvoir disposer dune procdure VBA qui permette : 1. Depuis la feuille mouvements , stockage dans une variable article du contenu de la cellule C6 dans une variable mvt du contenu de la cellule D6 (entre ou sortie) dans une variable Qte du contenu de la cellule E6 (la quantit mouvemente) 2. Atteindre la feuille Stock Se positionne en A8 (dbut de la liste des articles) Tant que le contenu de la cellule active est diffrent du contenu de la variable article dplacement dune cellule vers le bas Fin Tant Que 3. dplacement de deux cellules vers la droite Lire la valeur du stock actuel Si mvt= entre Alors Valeur de la cellule active = valeur du stock actuel + Qte Sinon Valeur de la cellule active = valeur du stock actuel Qte Ouvrir la fentre du module actif de lditeur Visual Basic (Outils > Macro > VBE) et crire la nouvelle procdure De quelle syntaxe avez-vous besoin pour crire notre procdure en VBA ? Rappel : le code contenu dans une procdure est encadr par les mentions Sub mettreajourstock () ........ ........ End sub Dclarer des variables sur le modle : Dim Mvt As String (ou Integer etc) Atteindre une feuille particulire Sheets("Stock").Select Atteindre une cellule particulire

Range("A8").select
Affecter une valeur dans la cellule active

ActiveCell.Value=6 Ou ActiveCell.Value=Qte (ici cest la valeur contenue dans quantit qui est stockes dans la cellule active) ActiveCell.Value = ActiveCell.Value Mvt (ici la valeur contenue dans la cellule active est diminue de la valeur de la variable Mvt) Ou Worksheets("Mouvements").Range("G6").value= true Affecter dans une variable la valeur contenue dans une cellule Article=Range("C6").Value ou Article= ActiveCell.Value ( condition dtre sur la bonne celllule)
Se dplacer par rapport la cellule active Une case vers le bas ActiveCell.Offset(1, 0).Range("A1").Select Une case vers le haut ActiveCell.Offset(-1, 0).Range("A1").Select Une case vers la gauche ActiveCell.Offset(0, -1).Range("A1").Select Une case vers la droite ActiveCell.Offset(0, 1).Range("A1").Select

Iufm Champagne Ardenne J. Bresson VBA Exemple2

page 3/3

Balayage dune liste par un tant que While ActiveCell.Value <>article se dplacer vers la cellule du dessous ActiveCell.Offset(1, 0).Range("A1").Select Wend Mise en place dune condition if Mvt= "Entre" Then ActiveCell.Value = ActiveCell.Value + Qte else ActiveCell.Value = ActiveCell.Value - Qte End If

Attention, lorsquune erreur sest glisse dans une procdure, lorsque vous jouer le programme, le dbogueur vous signale lerreur. Mais il faudra ensuite dbloquer lexcution pour pouvoir tester de nouveau.

Enregistrez rgulirement les modifications ralises dans la feuille et dans lEditeur VisualBasic Crez comme prcdemment un bouton (depuis la barre doutils formulaires) et affectez-lui la nouvelle macro cre

Testez le fonctionnement de votre procdure. Le stock de larticle Deskjet 890 n&b doit diminuer de la valeur sortie de stock. Voir le corrig encre_cor1.xls Ce premier petit programme gagnerait tre amlior : En effet, il faut pouvoir saisir dautres mouvements de stock, comme la procdure de mise jour du stock fonctionne partir des donnes figurant en premire ligne (C6,D6,E6) : il faudrait crer une procdure qui permette dinsrer 4 nouvelles cellules au dbut de la zone constatant les mouvements dans la feuille Mouvements il serait utile galement que les listes droulantes qui scurisent la saisie des libells et du type de mouvement (entre ou sortie) soient aussi recopies, mais dont les choix soient effacs. Une simple macro ( inserer ) en mode enregistrement permet de faire cela.

On laffectera un nouveau bouton dont le libell sera Entres /Sorties

Ces premiers pas ont permis de dcouvrir quelques principes de base qui prsident la production de programmes en VBA pour Excel. Il reste que lexemple choisit demande quelques amliorations complmentaires : par exemple sassurer quune opration dentre ou Sortie ne peut pas donner lieu plus dune mise jour du stock (en effet actuellement si lon clic deux fois sur le bouton Voir le Stock , on gnre deux mises jour (il suffirait par exemple de stocker une information sur la ligne de mouvement pour signaler que le mouvement a donn lieu une mise jour) Ouvrir une bote de message lorsque le Stock dalerte est atteint suite une mise jour (utilisation possible de MsgBox associe un test dans la feuille stock) (voir Encre_cor2.xls) Etc
Iufm Champagne Ardenne J. Bresson VBA Exemple2 page 4/4

Remarque : Les dates dans la gestion des stocks dencre

Comment stocker une date du jour ? On connat la fonction AUJOURDHUI() mais elle nest pas sans poser problme. En effet elle met jour la valeur dlivre chaque ouverture de la page, donc elle ne peut tre stocke dans les cellules de la colonne Date Il suffit, en mode "enregistrement" de raliser une petite macro qui stocke dans la cellule active, la fonction aujourdhui() puis copie le contenu de la cellule et procde un collage spcial "valeur seulement" Sub stockage_date() ' stockage_date Macro ActiveCell.FormulaR1C1 = "=TODAY()" Range("B6").Select Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Application.CutCopyMode = False Range("C6").Select End Sub Cette macro peut tre appele depuis la macro "insrer()" par l'instruction "call" L'utilisation de botes de dialogue Comment modifier la procdure de mise jour du stock pour que l'on puisse procder sur demande une nouvelle saisie de mouvement ? Il convient de demander l'utilisateur (via une bote de dialogue) s'il souhaite saisir un nouveau mouvement. La syntaxe est la suivante : Sub autre_maj() ' ' Vrifier sur quelle touche l'utilisateur a cliqu ' partir d'un MsgBox Dim message, titre As String Dim reponse As Byte 'La variable reponse reoit une valeur numrique qui correspond la touche clique. titre = "Mouvements de stock" message = " saisir un autre Mouvement" reponse = MsgBox(msg, vbYesNo, titre) If reponse = vbYes Then MsgBox "Saisie d'un nouveau mouvement de stock" 'appel de la macro d'insertion call inserer End If End Sub Cette macro

trouve sa place la fin de la procdure de mise jour "miseajourstock"


On comprend ensuite que l'utilisation d'une fentre de formulaire permettrait d'viter la succession de botes de dialogue. Voir par exemple la deuxime partie de l'exercice portant sur la correction d'un grafcet.

En fait, on remarque que l'on pourrait s'affranchir compltement de la saisie directe dans la feuille. On utiliserait alors la fonction Inputbox qui permet d'afficher un message avec zone de saisie pour entrer des donnes, par exemple Qte=inputbox("Entrez la quantit :","quantite"). La saisie serait alors entirement guide par le jeu des instructions de la macro, la mise jour du stock serait automatique et immdiate aprs chaque nouvelle entre de mouvement. Voir exercice sur rservation de salle.

Iufm Champagne Ardenne J. Bresson VBA Exemple2

page 5/5

You might also like