Microsoft 365 Mise à jour cellules du stock

rubis54

XLDnaute Occasionnel
Bonjour tout le monde,

Après multiples changements de mon classeur Stock, je pense avoir trouvé quelque chose de plus simple mais trop difficile pour moi en ce qui concerne le VBA pour faire fonctionner cela.

Explications:

A part la feuille "TDB" et "STOCK" il y a 3 feuilles supplémentaires "SORTIE DU JOUR, COMMANDE et ENTREE STOCK"

- sur ces trois feuilles, on se place sur B2 pour taper les premières lettres de l'article recherché et on presse la touche Entrée. Ensuite il affiche en colonne "D" les articles trouvés. On choisit ensuite l'article voulu, on double clique sur l'article et il vient s'afficher dans le tableau à droite(pareil pour les trois feuilles) il ne reste plus qu'a remplir les cellules de la colonne Qté.

Jusqu'ici tout va bien. Lorsque je clique sur "RAZ et Mise à jour stock", il mets à jour uniquement les deux premières lignes de mon stock. Donc même si je choisis un seul article par exemple " tomates " pour la sortie du jour , pour la commande ou pour entrée stock, il mettra à jour la première ligne de mon stock au lieu de mettre à jour la ligne des tomates dans le stock.

Alors est ce quelqu'un pourrai m'aider à rectifier ces erreurs SVP.

Je vous Remercie d'avance.

Rubis54
 

Pièces jointes

  • gestion-stock.xlsm
    234.6 KB · Affichages: 37

Lolote83

XLDnaute Barbatruc
Bonjour RUBIS54,
Dans ton module1, macro Sub RAZSORTIE() changer les lignes suivantes par celles-ci.
Vu que tu utilises un tableau structuré.
Code:
    For X = 2 To 1685
        If So.Range("G" & X + 4) <> "" Then
            Ci.Range("E" & X).Value = Ci.Range("E" & X).Value - So.Range("G" & X + 4).Value
        End If
    Next X

a remplacer par

Code:
    For X = 2 To 1685
        If So.Range("G" & X + 4) <> "" Then
            xLig = So.Range("L" & X + 4)
            Range("Tableau2[Stock]")(xLig, 1) = Range("Tableau2[Stock]")(xLig, 1) - So.Range("G" & X + 4).Value
        End If
   Next X

Par contre, j'ai rajouté une formule en cellule L6 à tirer vers le bas
1632830276308.png

@+ Lolote83
 

fanch55

XLDnaute Barbatruc
salut à tous,
@Lolote83 , pourquoi ne pas mettre la formule dans le code ?
VB:
    For X = 2 To 1685
        If So.Range("G" & X + 4) <> "" Then
            On Error Resume Next
            xLig = WorksheetFunction.Match(Range("F" & X + 4), [Tableau2[Désignation]], 0)
            If Err <> 0 _
            Then Err.Clear _
            Else [Tableau2[Stock]].Rows(xLig) = [Tableau2[Stock]].Rows(xLig) - So.Range("G" & X + 4).Value
        End If
   Next X
 

fanch55

XLDnaute Barbatruc
@rubis54
le code en entier :

VB:
Sub RAZSORTIE()
'
' RAZSORTIE Macro
   Dim X As Integer, Lr As Integer
   Dim So As Worksheet, Ci As Worksheet

   Set So = Worksheets("SORTIE DU JOUR"): Lr = So.Cells(So.Rows.Count, "G").End(xlUp).Row
   Set Ci = Worksheets("STOCK")

   Application.ScreenUpdating = False
    For X = 2 To Lr
        If So.Range("G" & X + 4) <> "" Then
            On Error Resume Next
            xLig = WorksheetFunction.Match(Range("F" & X + 4), [Tableau2[Désignation]], 0)
            If Err <> 0 _
            Then Err.Clear _
            Else [Tableau2[Stock]].Rows(xLig) = [Tableau2[Stock]].Rows(xLig) - So.Range("G" & X + 4).Value
        End If
   Next X
  
   So.Range("F6:G" & Lr).ClearContents

   Set So = Nothing
   Set Ci = Nothing
  
   MsgBox "Mise a jour stock terminé et RAZ"
  
End Sub

Par contre, vous devez avoir des problèmes avec celui de la feuille et il vaudrait mieux n'afficher que les produits que vous avez en stock ( > 0 ) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Address = [B2].Address Then
        Range("D2:D" & WorksheetFunction.Max(2, Cells(Rows.Count, "D").End(xlUp).Row)).Clear
        [Tableau2].ListObject.Range.AutoFilter
        [Tableau2].ListObject.Range.AutoFilter Field:=2, Criteria1:="=" & [B2] & "*", Operator:=xlAnd
        [Tableau2].ListObject.Range.AutoFilter Field:=5, Criteria1:=">0", Operator:=xlAnd
        [Tableau2[Désignation]].SpecialCells(xlCellTypeVisible).Copy [D2]
        [Tableau2].ListObject.Range.AutoFilter
    End If
    
End Sub
 

rubis54

XLDnaute Occasionnel
Bonjour RUBIS54,
Dans ton module1, macro Sub RAZSORTIE() changer les lignes suivantes par celles-ci.
Vu que tu utilises un tableau structuré.
Code:
    For X = 2 To 1685
        If So.Range("G" & X + 4) <> "" Then
            Ci.Range("E" & X).Value = Ci.Range("E" & X).Value - So.Range("G" & X + 4).Value
        End If
    Next X

a remplacer par

Code:
    For X = 2 To 1685
        If So.Range("G" & X + 4) <> "" Then
            xLig = So.Range("L" & X + 4)
            Range("Tableau2[Stock]")(xLig, 1) = Range("Tableau2[Stock]")(xLig, 1) - So.Range("G" & X + 4).Value
        End If
   Next X

Par contre, j'ai rajouté une formule en cellule L6 à tirer vers le bas
Regarde la pièce jointe 1116699

@+ Lolote83
Bonjour Lote83,

Merci pour ton aide et ton code VBA. Je l'ai placé et il fonctionne. Je l'ai aussi placé sur la feuille "entrée stock" et j'ai juste changé le "-" en "+".
J'ai quand même 3 questions si tu permets;
1) Le code copié en L je dois le tirer vers le bas complètement ou juste à la fin du document ?
2) Sur la feuille "STOCK" j'ai fais une erreur dés le départ je crois ! J'aurai bien aimé avoir un genre de combobox qui me sert à rechercher rapidement un article dans mon stock, afin de pouvoir vérifier cet article.

Alors ma question est : peut_on placer un combobox par exemple sur la feuille "STOCK" dans la celulle "J7"
de façon à ce que la recherche se fasse dans la colonne "B" "Désignation" ?
3) Le code de Fanch55 changerait quoi ?

Merci pour ta réponse

A+
 

rubis54

XLDnaute Occasionnel
@rubis54
le code en entier :

VB:
Sub RAZSORTIE()
'
' RAZSORTIE Macro
   Dim X As Integer, Lr As Integer
   Dim So As Worksheet, Ci As Worksheet

   Set So = Worksheets("SORTIE DU JOUR"): Lr = So.Cells(So.Rows.Count, "G").End(xlUp).Row
   Set Ci = Worksheets("STOCK")

   Application.ScreenUpdating = False
    For X = 2 To Lr
        If So.Range("G" & X + 4) <> "" Then
            On Error Resume Next
            xLig = WorksheetFunction.Match(Range("F" & X + 4), [Tableau2[Désignation]], 0)
            If Err <> 0 _
            Then Err.Clear _
            Else [Tableau2[Stock]].Rows(xLig) = [Tableau2[Stock]].Rows(xLig) - So.Range("G" & X + 4).Value
        End If
   Next X
 
   So.Range("F6:G" & Lr).ClearContents

   Set So = Nothing
   Set Ci = Nothing
 
   MsgBox "Mise a jour stock terminé et RAZ"
 
End Sub

Par contre, vous devez avoir des problèmes avec celui de la feuille et il vaudrait mieux n'afficher que les produits que vous avez en stock ( > 0 ) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   
    If Target.Address = [B2].Address Then
        Range("D2:D" & WorksheetFunction.Max(2, Cells(Rows.Count, "D").End(xlUp).Row)).Clear
        [Tableau2].ListObject.Range.AutoFilter
        [Tableau2].ListObject.Range.AutoFilter Field:=2, Criteria1:="=" & [B2] & "*", Operator:=xlAnd
        [Tableau2].ListObject.Range.AutoFilter Field:=5, Criteria1:=">0", Operator:=xlAnd
        [Tableau2[Désignation]].SpecialCells(xlCellTypeVisible).Copy [D2]
        [Tableau2].ListObject.Range.AutoFilter
    End If
   
End Sub
Bonjour Fanch55,

Merci pour votre réponse.
Quel serait le changement par rapport au code de Lolote83 ?

Ensuite pour le code erreur que vous indiquez à propos des qté dispo ou pas du stock, cela m'indique sur mon TDB si une date approche trop mais également si un article n'est plus en stock afin de pouvoir commander.

Mais j'accepte toutes les améliorattions qu'on me donne ci cela aide le fonctionnement de mon classeur.

Merci d'avance pour votre réponse

A+
 

fanch55

XLDnaute Barbatruc
Quel serait le changement par rapport au code de Lolote83 ?
Cela évite d'avoir une colonne supplémentaire et d'avoir à tirer la formule vers le bas.
Ce code est également optimisé pour ne pas parcourir inutilement les 1685 lignes ...

Ensuite pour le code erreur que vous indiquez à propos des qté dispo ou pas du stock, cela m'indique sur mon TDB si une date approche trop mais également si un article n'est plus en stock afin de pouvoir commander.
Je ne relève pas d'erreur sur le stock.
Je trouve inutile et contre performant d'extraire les désignations à chaque modification de cellule quelle qu'elle soit .
Quand je parle de la quantité d'un produit, je me disais juste qu'on pouvait éviter de sortir un produit quand son stock était nul .
 

rubis54

XLDnaute Occasionnel
Cela évite d'avoir une colonne supplémentaire et d'avoir à tirer la formule vers le bas.
Ce code est également optimisé pour ne pas parcourir inutilement les 1685 lignes ...


Je ne relève pas d'erreur sur le stock.
Je trouve inutile et contre performant d'extraire les désignations à chaque modification de cellule quelle qu'elle soit .
Quand je parle de la quantité d'un produit, je me disais juste qu'on pouvait éviter de sortir un produit quand son stock était nul .
RE, Fanch55,

OK c'est fait. Merci.
Une dernière question ;

Sur la feuille "STOCK" j'ai fais une erreur dés le départ je crois ! J'aurai bien aimé avoir un genre de combobox qui me sert à rechercher rapidement un article dans mon stock, en tapant par exemple les premières lettres, afin de pouvoir consulter, vérifier ou modifier cet article.

Peut_on placer ce combobox par exemple sur la feuille "STOCK" dans la celulle "J7"
de façon à ce que la recherche se fasse dans la colonne "B" "Désignation" ?

Merci pour votre aide.

A+
 

fanch55

XLDnaute Barbatruc
Je vous invite à mettre ce code dans la feuille Stock et à l'exécuter
VB:
Private Sub Worksheet_Activate()
    If [Tableau2].ListObject.AutoFilter Is Nothing Then
        [Tableau2].AutoFilter
    End If
End Sub
Puis faites connaissance avec les Filtres natifs d'excel :
1632849793498.png
 

rubis54

XLDnaute Occasionnel
Je vous invite à mettre ce code dans la feuille Stock et à l'exécuter
VB:
Private Sub Worksheet_Activate()
    If [Tableau2].ListObject.AutoFilter Is Nothing Then
        [Tableau2].AutoFilter
    End If
End Sub
Puis faites connaissance avec les Filtres natifs d'excel :
Regarde la pièce jointe 1116728
Merci Fanch55,

Mais il y a un soucis !
les boutons de filtre de mon tableau stock disparaissent après chaque opération effectuée sur une des feuilles suivantes; SORTIE DU JOUR, COMMANDE ou ENTREE STOCK. Le tableau reste en place a part ces boutons !
Comment cela est possible ?
 

rubis54

XLDnaute Occasionnel
Merci Fanch55,

Mais il y a un soucis !
les boutons de filtre de mon tableau stock disparaissent après chaque opération effectuée sur une des feuilles suivantes; SORTIE DU JOUR, COMMANDE ou ENTREE STOCK. Le tableau reste en place a part ces boutons !
Comment cela est possible ?
Merci Fanch55,

Mais il y a un soucis !
les boutons de filtre de mon tableau stock disparaissent après chaque opération effectuée sur une des feuilles suivantes; SORTIE DU JOUR, COMMANDE ou ENTREE STOCK. Le tableau reste en place a part ces boutons !
Comment cela est possible ?
Désolé Fanch55, tout fonctionne ! ouf !

Quand tout à l'heure vous disiez que c'est inutile les stocks nuls, vous vouliez dire quoi ? Car parfois il arrive qu'un stock soit épuisé par oubli de commande et pour cela j'ai les alertes sur le TDB.
 

fanch55

XLDnaute Barbatruc
C'est surtout valable pour la feuille "sortie du Jour".
On prend l'exemple du Balai dans la base,
le stock est à zéro
1632854304819.png
On va dans "sortie du jour",
si on ne controle pas la dispo,
le balai est proposé ...
Alors on en sort 4 ...
1632854523178.png
On se retrouve avec le stock en négatif ...
1632854591531.png
 

rubis54

XLDnaute Occasionnel
C'est surtout valable pour la feuille "sortie du Jour".
On prend l'exemple du Balai dans la base,
le stock est à zéro
Regarde la pièce jointe 1116735
On va dans "sortie du jour",
si on ne controle pas la dispo,
le balai est proposé ...
Alors on en sort 4 ...
Regarde la pièce jointe 1116737
On se retrouve avec le stock en négatif ...Regarde la pièce jointe 1116739
Oui Fanch55, c'est correct. Mais je dois encore mettre a jour les articles avec stock zéro, ensuite cela devrait fonctionner.

Sinon y a t-il un moyen de faire en sorte que si un article est a zéro, qu'on puisse le voir au moment de la sortie ?
 

Statistiques des forums

Discussions
311 721
Messages
2 081 927
Membres
101 842
dernier inscrit
seb0390