Gestion de stock et vente Soustraire des quantités dans une cellules en VBA
Bonjour à tous
Novice niveau -12 dans le vba je rencontre un souci avec mon fichier.
Je tente tant bien que mal de me créer une gestion des stocks et des ventes.
Je rencontre un souci, je chercher à décrémenter un nombre dans une cellule en passant par un userform, mais je ne sais pas du tout comment faire cela.
Quand je rentre une quantité dans mon userform ajoutRecette je voudrais qu'il soustrait cette quantité dans le stock.
Je joint un fichier pour plus de compréhension.
Merci
Bonjour,
Voici un code à placer dans un module normal :
Sub MajStock()
With AjoutRecette
For Each ctrl In .Controls
If ctrl.Name Like "cboRef*" Then
if ctrl <> "" then
num = Replace(ctrl.Name, "cboRef", "")
lig = Application.Match(ctrl, Range("TStock[SKU]"), 0)
Range("TStock[QTS vendu]")(lig) = Range("TStock[QTS vendu]")(lig) + .Controls("txtQts" & num).Value
Range("TStock[Qts en stock]")(lig) = Range("TStock[Qts en stock]")(lig) - .Controls("txtQts" & num).Value
If Range("TStock[Qts en stock]")(lig) = 0 Then Range("TStock[En stock]")(lig) = "Vendu"
end if
End If
Next ctrl
End With
End Subet à exécuter au clic Ajouter, donc dans la macro btnajouter_click, on y appelle cette macro :
Private Sub btnAjouter_Click()
'Ajouter au recettes
'Affiche un message si l'id n'ai pas référencer
If txtID.Value = "" Then
MsgBox "Pas d'ID référencé"
Exit Sub
End If
Call MajStockJe n'ai pas testé mais je pense que ça devrait aller. Sinon, il faudra bien contrôler vos noms de colonnes impliquées.
Cdlt,
Bonjour à tous,
@3GB > 3 coquilles ...
1 - Range("STtock[En stock]")(lig) > une simple inversion de lettre > TStock ...
2 - .Controls(txtQts & num).Value > il manque les guillemets > .Controls("txtQts" & num).Value ...
3 - il n'y a pas de contrôle des "QTS En stock" qui peuvent passer en négatif ...
Du gros boulot en perspective ...
Note : En feuille "Stock" > le tableau porte bien le nom "TStock" > mais les données ont été écrites sous le tableau et non dedans ...
ric
Bonjour
Un grand merci à vous 2, cela fonctionne très bien avec la correction de ric.
J'ai une autres question :D
Je vends en général un produit par client, mais il arrive parfois que je vende 2 ou 3 référence différentes.
Je souhaiterais ajouter une ligne dans recette pour chaque produit différent vendu au même client tout en gardant les infos du client c'est à dire si un client m'achète 3 articles différents, j'ai 3 lignes avec les mêmes information ID, mois N°facture, adresse, mail, etc mais les informations concernant les produits REF, Nom Produits, Quantités, Prix changerais.
Je joint le fichier mis à jour.
Encore un grand merci pour votre aide.
Bonjour à tous,
Merci Ric, j'édite mon code tout de suite... Comme j'ai dit, je n'ai pas testé, notamment parce que les données étaient en-dessous du tableau comme tu l'as fait remarquer...
Pour les stocks négatifs, c'est une bonne remarque à laquelle j'ai pensé. Mais je pense que ce problème doit se gérer en amont, notamment lors d'un changement sur une des textbox txtQts...
Cdlt,
Bonjour à tous
Je reviens vers vous car j'ai une autre demande.
Via mon userform AjoutRecette, j'essaie d'ajouter plusieurs lignes si il y a une valeur dans la combox et si il y en a pas on ajoute rien.
J'ai tenté l'expérience avec ce bout de code
If cboRef2 <> "" Then
Me.cboRef2.Value = ""
Else
Me.cboRef2.Value = Sheets("Recettes").Range("X" & ligne).Offset(1, 0) = cboRef2
End Ifmais j'ai une erreur d'exécution qui apparait. Et je ne sais pas du tout comment la régler.
Le but recherché est, si je vend plusieurs articles différent au même client, il faut que je puisse les ajouter à ma feuille Recettes, mais il faudrait que je recopie aussi c'est info et coordonnées.
En gros si je vends 10 articles à un client sur la même facture il y aura 10 fois la même ref, numéro de facture, date d'achat etc, seul les infos des articles changes à savoir ref, Nom du produit, quantités et prix changerons.
Je joint un fichier pour plus de compréhension.
Merci pour tout
Cordialement
Bonjour,
Je n'ai pas regardé le fichier pour l'instant mais je peux déjà dire que la principale erreur tient dans la double égalité sur la ligne sur Else.
Voici un essai, à titre d'exemple et à contrôler et le cas échéant adapter à vos références :
for j = 1 to 10 '10 nombre de cbobox comme ça (pour chaque ligne de qté de l'UF)
if Me.controls("TxtQts" & j).value > 0 and Me.controls("cboRef" & j).value <> "" then 'si cbx non vide et qté non nulle
with sheets("Recettes") 'avec feuille recettes
dl = .cells(.rows.count, "X").end(xlup).row 'dernière ligne
for i = 1 to Me.controls("TxtQts" & j).value 'autant de fois que de qté à la ligne j
.Range("X" & dl + i).value = Me.controls("cboRef" & j).value 'dern ligne + i de X vaut valeur de cbx
next i
end with
end if
next ctrlCdlt,
Bonjour
Merci pour votre réponse rapide.
J'ai modifié la fin du script ou j'ai mis un "j" après next .
Cela fonctionne, mais il me rajoute que les références des mes articles et pas le reste
Il faudrait qu'il duplique la ligne juste en modifiant les ref, nom produits, qts et prix
Cordialement
En effet, il indique que la ligne que vous aviez mis au départ
Les infos liées aux produits (multiples pour une seule recette) doivent être reportées de la même manière (les valeurs dépendent de j) mais en adaptant le nom du contrôle. Les infos "uniques" sont à répéter mais leur valeur ne dépend pas de j. D'ailleurs, je mets le code à jour car la seconde boucle est une erreur :
for j = 1 to 10 '10 nombre de cbobox comme ça (pour chaque ligne de qté de l'UF)
if Me.controls("TxtQts" & j).value > 0 and Me.controls("cboRef" & j).value <> "" then 'si cbx non vide et qté non nulle
with sheets("Recettes") 'avec feuille recettes
dl = .cells(.rows.count, "X").end(xlup).row 'dernière ligne
.Range("X" & dl + 1).value = Me.controls("cboRef" & j).value '<<< valeur renvoyée dépend de j
.range("??" & dl + 1).value = Me.nomducontrolefixe.value '<<< valeur renvoyée fixe, ne dépend pas de j
end with
end if
next jVoilà, il suffit de mettre autant de lignes que nécessaire et d'indiquer les bonnes lettres de colonnes.
Cdlt,