Macro mise à jour inventaire et recensement mouvements stock
Bonjour à tous les internautes et cracks d'excel!!
je sollicite votre aide pour le problème de macro suivant:
j'ai un fichier de gestion des stocks qui à l'origine devait permettre la mise à jour de stock dans la feuille "produits référencés" depuis un bouton de commande dénommé "validé" et intégrer dans le module 1.
j'ai voulu intégrer une fonction supplémentaire à ce bouton de commande afin que chaque mouvement de stock (entrée, sortie) apparaisse dans la feuille "mouvements quotidiens".
et là problème
j'en appelle ainsi à l'aide des internautes de ce site car je n'arrive pas du tout à m'en sortir
d'avance merci beaucoup!!!!
mon fichier est joint au présent message à l'addresse suivante
https://www.excel-pratique.com/~files/doc2/G_STOCK_v1_4.zip
et le code à l'origine se présentait comme suit:
Sub Bouton2_QuandClic()
pprod = Range("b4").Value
op = Range("b5").Value
vvaleur = Range("b6").Value
ddate = Range("b7").Value
vdiff = Range("b10").Value
If op = "" Or vvaleur = "" Or ddate = "" Or pprod = "" Then
MsgBox ("Toutes les zones doivent être renseignées")
Exit Sub
End If
If op <> "Commande" Then
rep = MsgBox("Vous allez mettre à jour le stock, Voulez vous contiuer ?", vbYesNo)
If rep = vbYes Then
Range("b5:b6").ClearContents
Worksheets("Produits Référencés").Select
Cells.Find(What:=pprod, After:=ActiveCell, LookIn:=xlFormulas, _
lookat:=xlWhole, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
If op = "Inventaire" Then
Cells(ActiveCell.Row, 6).Value = vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
End If
If op = "Entrée" Then
Cells(ActiveCell.Row, 6).Value = Cells(ActiveCell.Row, 6).Value + vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
End If
If op = "Sortie" Then
Cells(ActiveCell.Row, 6).Value = Cells(ActiveCell.Row, 6).Value - vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
End If
End If
Worksheets(2).Select
Else
rep2 = MsgBox("Vous allez mettre à jour les commandes, Voulez vous contiuer ?", vbYesNo)
If rep2 = vbYes Then
Range("b5:b6").ClearContents
Worksheets("Commande").Select
Range("a1").Activate
Cells.Find(What:=pprod, After:=ActiveCell, LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Cells(ActiveCell.Row, 2).Value = ddate
Cells(ActiveCell.Row, 3).Value = vvaleur
Cells(ActiveCell.Row, 4).Value = "Non"
End If
End If
End Sub
Sub Bcomm_QuandClic()
Range("d3:d500").Select
For Each cece In Selection
If cece.Value = "Oui" Then
dquant = Cells(cece.Row, cece.Column - 1).Value
ddate = Range("b1").Value
dprod = Cells(cece.Row, cece.Column - 3).Value
lili1 = cece.Row - 1
lili2 = cece.Row + 500 - 1
Worksheets("Produits Référencés").Select
Cells(lili1, 6).Value = Cells(lili1, 6).Value + dquant
Worksheets("Commande").Select
Cells(cece.Row, cece.Column - 2).ClearContents
Cells(cece.Row, cece.Column - 1).ClearContents
Cells(cece.Row, cece.Column).ClearContents
End If
Next
Range("a1").Select
End Sub
Bonjour alex54, forum,
J'avais jeté un oeil sur ton premier fichier ( https://forum.excel-pratique.com/viewtopic.php?t=14039 ) et je vois que tu as complètement modifié ton Userform2!
Dans ton nouveau code place le :
Dim pprod As String
au-dessus de
Sub Bouton2_QuandClic()
Comme ça :
Dim pprod As String
Sub Bouton2_QuandClic()
Dans les macros Bouton2_QuandClic et message1, remplace :
Cells.Find(What:=pprod, After:=ActiveCell, LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
par
Cells.Find(What:=pprod, After:=Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Il fallait déclarer la variable pprod hors module afin que la fonction message1 puisse y faire référence.
Dans ta fonction message1, j'ai remplacé le After:=ActiveCell par After:=Cells(1, 1) afin
que la recherche se fasse à partir de la toute première cellule (et non la cellule active).
Bonsoir VBA-new,
tout d'abord, merci infiniment de t'être intéressé à mon problème!!
ta solution est parfaite!! ça marche impeccable!!! encore merci, merci, merci et merci!!!
il ne me restera plus à présent qu'à régler le petit problème de retranscription de la cellule B8 de la feuille "saisie" (nom du fournisseur) vers la colonne F du tableau "mouvements quotidiens".
je pense qu'en déclarant une variable du type ' fournisseur=Range("b8").Value ' à la suite de ' vdiff = Range("b10").Value ' et en l'intégrant au fur et à mesure du module comme :
Call maj(ddate, pprod, op, vvaleur, fournisseur, "")
.Range("f" & dl1) = fournisseur
ça devrait marcher (enfin je l'espère... car je suis pas une flèche en VB. heureusement qu'il y a des gens comme toi pour nous venir en aide)!!
Et encore une fois, VBA-new, merci pour tout
Alex
Y'a pas de quoi
J'avais oublié le "problème" du fournisseur!
Tu es sur la bonne voie pour faire les modifs.
Sinon, si tu veux prendre en compte les fournisseurs (qui devient donc un champ obligatoire), remplace le code de Bouton2_QuandClic() par celui-ci :
Dim pprod As String
Sub Bouton2_QuandClic()
Dim ddate As Date
Dim op As String, ffournisseur As String
Dim vvaleur As Integer
pprod = Range("b4").Value
op = Range("b5").Value
vvaleur = Range("b6").Value
ddate = Format(Range("b7").Value, "dd/mm/yyyy")
vdiff = Range("b10").Value
ffournisseur = Range("b8").Value
If op = "" Or vvaleur = 0 Or ddate = 0 Or pprod = "" Or ffournisseur = "" Then
MsgBox ("Toutes les zones doivent être renseignées")
Exit Sub
End If
Select Case op
Case "Commande"
rep2 = MsgBox("Vous allez mettre à jour les commandes, Voulez vous contiuer ?", vbYesNo)
If rep2 = vbYes Then
Range("b5:b6").ClearContents
Worksheets("Commande").Range("a1").Activate
Cells.Find(What:=pprod, After:=Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Cells(ActiveCell.Row, 2).Value = ddate
Cells(ActiveCell.Row, 3).Value = vvaleur
Cells(ActiveCell.Row, 4).Value = "Non"
Call maj(ddate, pprod, op, vvaleur, "")
End If
Case "Inventaire"
If message1 = 0 Then Exit Sub
Cells(ActiveCell.Row, 6).Value = vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
Call maj(ddate, pprod, op, vvaleur, ffournisseur)
Case "Entrée"
If message1 = 0 Then Exit Sub
Cells(ActiveCell.Row, 6).Value = Cells(ActiveCell.Row, 6).Value + vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
Call maj(ddate, pprod, op, vvaleur, ffournisseur)
Case "Sortie"
If message1 = 0 Then Exit Sub
Cells(ActiveCell.Row, 6).Value = Cells(ActiveCell.Row, 6).Value - vvaleur
lili1 = ActiveCell.Row
lili2 = ActiveCell.Row + 151
Call maj(ddate, pprod, op, vvaleur, ffournisseur)
End Select
Worksheets(2).Select
End Sub
Puis dans le code de la macro maj, comme tu l'as dit, tu mets bien :
.Range("f" & dl1) = fournisseur
Attention tout de même, je n'ai pas modifié la partie de la macro Bouton2_QuandClic qui traite le cas du mouvement "Commande" (lorsque op="Commande"). Je ne sais pas de quoi ça parle.
Deuxième attention,
Alex54 a écrit :je pense qu'en déclarant une variable du type ' fournisseur=Range("b8").Value ' à la suite de ' vdiff = Range("b10").Value ' et en l'intégrant au fur et à mesure du module comme :
Call maj(ddate, pprod, op, vvaleur, fournisseur, "")
Cette modification est fausse vu que la fonction maj ne doit comporter que 5 arguments.
Tu dois donc mettre : Call maj(ddate, pprod, op, vvaleur, fournisseur)
(variable ffournisseur dans mon cas)
Ça "devrait" le faire.
bonsoir VBA-new,
une nouvelle merci pour ta réponse si rapide.
j'ai suivi ton conseil et heureusement que tu m'as précisé que la fonction maj ne devait comporter que 5 arguments car j'avais commencé à placer ffournisseur à la suite des autres arguments (ce qui en faisait 6) et je ne comprenais pas pourquoi j'avais un message d'erreur.
et là... ça le fait carrément!!!
mille fois merci VBA-new. je désespérais de ne pas pouvoir arriver à mes fins (ça faisait 3 jours que j'essayais de décortiquer des codes VB sur le net pour réussir mon tableau) et là, tu m'as ôté une belle épine du pied!!!
je ne le dirai jamais assez mais MERCI!!!
Alex