Vous êtes sur la page 1sur 5

Iufm Champagne Ardenne J.

Bresson VBA Exemple2 page 1/1


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 2/2
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 3/3
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 4/4
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

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

Iufm Champagne Ardenne J. Bresson VBA Exemple2 page 5/5
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"
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.

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.

Vous aimerez peut-être aussi