Facturation/gestion stock
Bonsoir à toutes et tous,
J'essaie de modifier mon classeur de facturation (réalisé avec l'aide du forum il y a quelques années) afin d'ajouter une gestion de stock (réalisée par gmb et dim 59). L'onglet facturation permet d'établir la facture avec le choix du client, des articles sélectionnés, le bouton save fabrique le PDF de la facture avec l'adresse au bon endroit pour les enveloppes à fenêtre. J'ai ajouté un bouton de mise à jour du stock en reprenant les fichiers de dim 59 modifiés, je ne comprends pas l'actualisation du stock à cause des offsets, les articles sont bien pris en compte dans l'historique de caisse mais pas les quantités, ni le prix, ni le code article et le stock n'ai pas mis à jour. Les onglets entrée et sortie de stock fonctionnent et les mouvements sont bien listés dans l'onglet journal de bord (avec l'heure de l'événement). Quelqu'un pourrait-il commenter le code ci-dessous (celui du bouton mise à jour du stock) afin que je puisse le comprendre. Voici en PJ l'intégralité du fichier. Merci pour votre aide.
Dul.
Option Explicit
Dim C, Article, Cell, LnCaisse, Flag, Numfac
Sub Valider()
'On vérifie que les article et leur quantité existent en stock
For Each C In Range(Cells(42, "c"), Cells(Cells(Rows.Count, "c").End(xlUp).Row, "C"))
If C.Value <> "" Then
Article = C.Value
Set Cell = Sheets("Stock").Range("A4:A" & Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row).Find(Article, lookat:=xlWhole)
If Not Cell Is Nothing Then
If Cell.Offset(0, 6).Value < C.Offset(0, 1).Value Then
MsgBox " Il n'y a que " & Cell.Offset(0, 6).Value & " " & C.Value & " en stock.", 16
End
End If
Else
MsgBox "L'article " & Article & " n'existe pas en stock.", 16
End
End If
Else
Exit For
End If
Next C
'On sort les articles du stock et on passe l'écriture de caisse
Flag = 0
For Each C In Range(Cells(42, "C"), Cells(Cells(Rows.Count, "C").End(xlUp).Row, "C"))
If C.Value <> "" Then
Flag = 1
Article = C.Value
Numfac = Sheets("Facturation").Range("f38")
Set Cell = Sheets("Stock").Range("A4:A" & Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row).Find(Article, lookat:=xlWhole)
Cell.Offset(0, 5).Value = Cell.Offset(0, 5).Value + C.Offset(0, 1).Value
LnCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
Range(C, C.Offset(0, 2)).Copy
Sheets("Historique Caisse").Cells(LnCaisse, 3).PasteSpecial xlPasteValues
Sheets("Historique Caisse").Cells(LnCaisse, "A").Value = Date
Sheets("Historique Caisse").Cells(LnCaisse, "B").Value = Numfac
Exit For
End If
Next C
If Flag = 1 Then
MsgBox "Mise à jour stock effectuée !"
End If
End Sub
Bonjour,
Regarde si ça te convient :
'Dim C, Article, Cell, LnCaisse, Flag, Numfac '*** il est fortement conseillé de typer les variables !
Dim C As Range
Dim Article As String
Dim Cell As Range
Dim LnCaisse As Long
Dim Flag As Integer
Dim Numfac As String
Sub Valider()
'*** déjà ici, c'est une erreur de ne pas "parenter" les Ranges. On ne sait même pas de quelle feuille il s'agit !!!
'On vérifie que les article et leur quantité existent en stock en colonne C à partir de C42
For Each C In Range(Cells(42, "c"), Cells(Cells(Rows.Count, "c").End(xlUp).Row, "C"))
'si la cellule n'est pas vide...
If C.Value <> "" Then
Article = C.Value
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set Cell = Sheets("Stock").Range("A4:A" & Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row).Find(Article, lookat:=xlWhole)
'si trouvé...
If Not Cell Is Nothing Then
'si en colonne G sur la même ligne la valeur est inférieure à la cellule de la colonne B (toujours sur la même ligne)
'message et fin de procédure (il est de coutume d'utiliser Exit Sub mais bon, chacun sa façon !)
If Cell.Offset(0, 6).Value < C.Offset(0, 1).Value Then
MsgBox " Il n'y a que " & Cell.Offset(0, 6).Value & " " & C.Value & " en stock.", 16
End
End If
'sinon message et fin la aussi !
Else
MsgBox "L'article " & Article & " n'existe pas en stock.", 16
End
End If
'dans le cas où la cellule est vide, on sort de la boucle
Else
Exit For
End If
Next C
'On sort les articles du stock et on passe l'écriture de caisse
Flag = 0
're-bouclage sur la même plage (on ne sait toujours pas sur quelle feuille on travaille !
For Each C In Range(Cells(42, "C"), Cells(Cells(Rows.Count, "C").End(xlUp).Row, "C"))
'toujours si la cellule n'est pas vide...
If C.Value <> "" Then
'bascule le drapeau à 1
Flag = 1
Article = C.Value
Numfac = Sheets("Facturation").Range("f38")
'recherche de l'article en colonne A de la feuille Stock à partir de A4
Set Cell = Sheets("Stock").Range("A4:A" & Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row).Find(Article, lookat:=xlWhole)
'ici, erreur de ne pas contrôler si Find() retourne bien un objet Range !
'incrémente la cellule en colonne F de la feuille Stock de la valeur de la cellule en colonne D de je ne sais pas quelle feuille !
Cell.Offset(0, 5).Value = Cell.Offset(0, 5).Value + C.Offset(0, 1).Value
'recherche la ligne de la dernière cellule non vide en colonne A de la feuille "Historique Caisse" et se décale sur la ligne vide du dessous
LnCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
'copie la cellule en colonne E sur la ligne en cours de la boucle
Range(C, C.Offset(0, 2)).Copy
'et la colle dans la ligne vide en colonne C en fin de liste dans la feuille "Historique Caisse"
'avec la date en colonne A et le numéro de facture en colonne B
Sheets("Historique Caisse").Cells(LnCaisse, 3).PasteSpecial xlPasteValues
Sheets("Historique Caisse").Cells(LnCaisse, "A").Value = Date
Sheets("Historique Caisse").Cells(LnCaisse, "B").Value = Numfac
Exit For
End If
Next C
'indique si une mise à jour a été faite
If Flag = 1 Then
MsgBox "Mise à jour stock effectuée !"
End If
End Sub
Bonjour Theze,
Je te remercie pour tes conseils et commentaires.
Le nom de l'article (le premier) est récupéré en C42 mais je ne comprends pas où est traitée la quantité (colonne M sur la feuille facturation)?
'On vérifie que les article et leur quantité existent en stock en colonne C à partir de C42
For Each C In Range(Cells(42, "c"), Cells(Cells(Rows.Count, "c").End(xlUp).Row, "C"))
'si la cellule n'est pas vide...
If C.Value <> "" Then
Article = C.Value
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set Cell = Sheets("Stock").Range("A4:A" & Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row).Find(Article, lookat:=xlWhole)
'si trouvé...
If Not Cell Is Nothing Then
'si en colonne G sur la même ligne la valeur est inférieure à la cellule de la colonne B (toujours sur la même ligne)
'message et fin de procédure (il est de coutume d'utiliser Exit Sub mais bon, chacun sa façon !)
If Cell.Offset(0, 6).Value < C.Offset(0, 1).Value Then
MsgBox " Il n'y a que " & Cell.Offset(0, 6).Value & " " & C.Value & " en stock.", 16
End
End If
Dul
Bonjour,
Je viens de reprendre le code et ce sont les cellules fusionnées qui foutent le bazar !
Supprime les fusions et testes ce code (ne fais que de supprimer les fusions des colonne C à K dans la feuille "Facturation"), ne déplace pas les colonnes pour l'instant ou du moins, avant d'avoir testé, à cause des Offsets) :
Sub Valider()
Dim FeFacture As Worksheet
Dim FeStock As Worksheet
Dim PlgFacture As Range
Dim PlgStock As Range
Dim CelFacture As Range
Dim CelStock As Range
Dim Article As String
Dim LgCaisse As Long
Dim Flag As Integer
Set FeFacture = Worksheets("Facturation")
Set FeStock = Worksheets("Stock")
With FeFacture: Set PlgFacture = .Range(.Cells(42, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
With FeStock: Set PlgStock = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
'On vérifie que les article et leur quantité existent en stock en colonne Cel à partir de C42
For Each CelFacture In PlgFacture
'si la cellule n'est pas vide...
If CelFacture.Value <> "" Then
'bascule le drapeau à 1
Flag = 1
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set CelStock = PlgStock.Find(CelFacture.Value, , xlValues, xlWhole)
'si trouvé...
If Not CelStock Is Nothing Then
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est inférieure
'à la quantité saisie en colonne M de la feuille "Facturation", message et fin de procédure
If CelStock.Offset(, 6).Value < CelFacture.Offset(, 10).Value Then
MsgBox "Il n'y a que " & CelStock.Offset(0, 6).Value & " " & CelFacture.Value & " en stock !", 16
Exit Sub
End If
'incrémente la cellule en colonne F ("Sortie") de la feuille "Stock" de la valeur
'de la cellule en colonne M de la feuille "Facturation"
CelStock.Offset(, 5).Value = CelStock.Offset(, 5).Value + CelFacture.Offset(, 10).Value
'recherche la ligne de la dernière cellule non vide en colonne A de la
'feuille "Historique Caisse" et se décale sur la ligne vide du dessous
LgCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
'inscrit les différentes valeurs...
With Sheets("Historique Caisse")
.Range("A" & LgCaisse).Value = Date
.Range("B" & LgCaisse).Value = FeFacture.Range("F38").Value 'numéro de facture
.Range("C" & LgCaisse).Value = CelFacture.Value 'dénomination
.Range("D" & LgCaisse).Value = CelFacture.Offset(, 10).Value 'quantité
.Range("E" & LgCaisse).Value = CelFacture.Offset(, 11).Value 'prix
End With
'sinon message et fin la aussi !
Else
MsgBox "L'article " & CelFacture.Value & " n'existe pas en stock !", 16
Exit Sub
End If
'dans le cas où la cellule est vide, on sort de la boucle
Else
Exit For
End If
Next CelFacture
'indique si une mise à jour a été faite
If Flag = 1 Then
MsgBox "Mise à jour du stock effectuée !"
End If
End Sub
Bonjour Theze,
Merci beaucoup, cela fonctionne parfaitement et le code est compréhensible pour moi maintenant.
J'ai essayé de modifier la macro validation pour éviter que l'on puisse déstocker plusieurs fois la même facture si on appuie plusieurs fois sur le bouton de "Mis à jour Stock". Pour cela je vérifie dans l'historique de caisse colonne C si le numéro est déjà créé. Si c'est le cas, un message de "facture déjà existante" et on sort, sinon on continue par la vérification des éléments en stock etc... Mais mes modifs ne fonctionnent pas.
D'autre part, dans la sortie manuelle de marchandises du stock ( onglet Sortie, donc hors ventes), je voudrais empêcher que l'on puisse enlever des marchandises si le stock de fin est inférieur à un article car on se retrouve avec des valeurs négatives ce qui fausse ensuite les nouvelles entrées.
Merci par avance pour ton aide, mes essais sont en PJ.
Dul
Bonjour,
Voilà pour la procédure de validation. Je regarderai pour la sortie de stock :
Sub Valider()
Dim FeFacture As Worksheet
Dim FeStock As Worksheet
Dim FeHistorique_Caisse As Worksheet
Dim PlgFacture As Range
Dim PlgStock As Range
Dim PlgHistorique_Caisse As Range
Dim CelFacture As Range
Dim CelStock As Range
Dim CelHistorique_Caisse As Range
Dim Article As String
Dim LgCaisse As Long
Dim Flag As Integer
Dim Numfact As String
Set FeFacture = Worksheets("Facturation")
Set FeStock = Worksheets("Stock")
Set FeHistorique_Caisse = Worksheets("Historique Caisse")
'recupere numero facture
Numfact = FeFacture.Range("F38").Value
'défini la plage sur la colonne 3 (C) de la feuille "Facturation"
With FeFacture: Set PlgFacture = .Range(.Cells(42, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'défini la plage sur la colonne 1 (A) de la feuille "Stock"
With FeStock: Set PlgStock = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
'défini la plage sur la colonne 3 (C) de la feuille "Facturation"
With FeHistorique_Caisse: Set PlgHistorique_Caisse = .Range(.Cells(4, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'vérifie si la facture existe déjà dans historique de caisse colonne c pour ne pas soustraire plusieurs fois le stock
For Each CelHistorique_Caisse In PlgHistorique_Caisse
If CelHistorique_Caisse = Numfact Then
MsgBox "La facture numéro '" & Numfact & "' existe déjà !"
Exit Sub 'si la facture existe déjà on sort
End If
Next CelHistorique_Caisse
'On vérifie que les article et leur quantité existent en stock en colonne Cel à partir de C42
For Each CelFacture In PlgFacture
'si la cellule n'est pas vide...
If CelFacture.Value <> "" Then
'bascule le drapeau à 1
Flag = 1
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set CelStock = PlgStock.Find(CelFacture.Value, , xlValues, xlWhole)
'si trouvé...
If Not CelStock Is Nothing Then
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est inférieure
'à la quantité saisie en colonne M de la feuille "Facturation", message et fin de procédure
If CelStock.Offset(, 6).Value < CelFacture.Offset(, 10).Value Then
MsgBox "Il n'y a que " & CelStock.Offset(0, 6).Value & " " & CelFacture.Value & " en stock !", 16
Exit Sub
End If
'incrémente la cellule en colonne F ("Sortie") de la feuille "Stock" de la valeur
'de la cellule en colonne M de la feuille "Facturation"
CelStock.Offset(, 5).Value = CelStock.Offset(, 5).Value + CelFacture.Offset(, 10).Value
'recherche la ligne de la dernière cellule non vide en colonne A de la
'feuille "Historique Caisse" et se décale sur la ligne vide du dessous
LgCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
'inscrit les différentes valeurs...
With Sheets("Historique Caisse")
.Range("A" & LgCaisse).Value = Date
.Range("B" & LgCaisse).Value = Time
.Range("C" & LgCaisse).Value = Numfact 'numéro de facture
.Range("D" & LgCaisse).Value = CelFacture.Value 'dénomination
.Range("E" & LgCaisse).Value = CelFacture.Offset(, 10).Value 'quantité
.Range("F" & LgCaisse).Value = CelFacture.Offset(, 11).Value 'prix
End With
'sinon message et fin la aussi !
Else
MsgBox "L'article " & CelFacture.Value & " n'existe pas en stock !", 16
Exit Sub
End If
'dans le cas où la cellule est vide, on sort de la boucle
Else
Exit For
End If
Next CelFacture
'indique si une mise à jour a été faite
If Flag = 1 Then MsgBox "Mise à jour du stock effectuée !"
End Sub
Bonjour,
La procédure de validation fonctionne bien, merci !
J'ai ajouté dans la macro validation un peu de code pour que les articles vendus apparaissent dans le journal de bord comme "sortie vente" (pour faire l'inventaire), j'ai essayé à la suite du bloc "inscription dans l'historique de caisse" mais tout plante.. j'ai finalement placé cette procédure tout à la fin avec un bricolage pour récupérer les données de la facture, mais seul le dernier article de la facture est pris en compte, il doit falloir faire une boucle pour balayer toutes les lignes pourrais-tu regarder, merci.
Dans l'onglet stock, j'ai ajouté un bouton qui permet de saisir les caractéristiques d'un nouvel article dans un userform et de transférer son contenu dans l'onglet stock ainsi que dans l'onglet produit (où sont conservés les tarifs de vente) et de laisser une trace dans "journal de bord", le code fonctionne mais est peut-être à améliorer et simplifier.
Le fichier complet est en PJ.
Dul
bonsoir Dul, Theze
dul ne serai tu pas sur un mac car les signes mis a la place des "é" le montre
'On vŽrifie qu'un numŽro de facture a bien ŽtŽ attribuŽ dans ("Facturation")
Bonsoir Grisan,
Oui, je suis bien sur un mac, je suis revenu sur ma vieille version 2011, j'ai abandonné la 15.31 d'office 365 où tout plante...
Cordialement.
Dul
bonsoir dul
modifie ta présentation pour préciser que tu es sur mac 2011 afin que les répondeurs
puissent orientés leurs réponses en fonction
Bonjour,
Regardes et dis moi. Adaptes le bloc sous le commentaire "'inscrit les différentes valeurs dans le journal de bord..." :
Sub Valider()
Dim FeFacture As Worksheet
Dim FeStock As Worksheet
Dim FeHistorique_Caisse As Worksheet
Dim PlgFacture As Range
Dim PlgStock As Range
Dim PlgHistorique_Caisse As Range
Dim CelFacture As Range
Dim CelStock As Range
Dim CelHistorique_Caisse As Range
Dim Article As String
Dim LgCaisse As Long
Dim Flag As Integer
Dim Numfact As String
Dim No_Ligneb As Integer
Dim Titre As String
Dim Qte As Integer
Set FeFacture = Worksheets("Facturation")
Set FeStock = Worksheets("Stock")
Set FeHistorique_Caisse = Worksheets("Historique Caisse")
'recupere numero facture
Numfact = FeFacture.Range("F38").Value
'On vérifie qu'un numéro de facture a bien été attribué dans ("Facturation")
If Numfact = "" Then
Beep
MsgBox "Il manque le numéro de facture !", vbExclamation
Exit Sub
End If
'défini la plage sur la colonne 3 (C) de la feuille "Facturation"
With FeFacture: Set PlgFacture = .Range(.Cells(42, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'défini la plage sur la colonne 1 (A) de la feuille "Stock"
With FeStock: Set PlgStock = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
'défini la plage sur la colonne 3 (C) de la feuille "Historique"
With FeHistorique_Caisse: Set PlgHistorique_Caisse = .Range(.Cells(4, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'vérifie si la facture existe déjà dans historique de caisse colonne c pour ne pas soustraire plusieurs fois le stock
For Each CelHistorique_Caisse In PlgHistorique_Caisse
If CelHistorique_Caisse = Numfact Then
MsgBox "La facture numéro '" & Numfact & "' existe déjà !", vbExclamation
Exit Sub 'si la facture existe déjà on sort
End If
Next CelHistorique_Caisse
'On vérifie que les article et leur quantité existent en stock en colonne Cel à partir de C42
For Each CelFacture In PlgFacture
'si la cellule n'est pas vide...
If CelFacture.Value <> "" Then
'bascule le drapeau à 1
Flag = 1
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set CelStock = PlgStock.Find(CelFacture.Value, , xlValues, xlWhole)
'si trouvé...
If Not CelStock Is Nothing Then
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est 0, message pas d'article en stock et fin de procédure
If CelStock.Offset(, 6).Value = 0 Then
MsgBox "Il n'y a plus de" & CelFacture.Value & " en stock !", vbExclamation
Exit Sub
End If
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est inférieure
'à la quantité saisie en colonne M de la feuille "Facturation", message et fin de procédure
If CelStock.Offset(, 6).Value < CelFacture.Offset(, 10).Value Then
MsgBox "Il n'y a que " & CelStock.Offset(0, 6).Value & " " & CelFacture.Value & " en stock !", vbExclamation
Exit Sub
End If
'incrémente la cellule en colonne F ("Sortie") de la feuille "Stock" de la valeur
'de la cellule en colonne M de la feuille "Facturation"
CelStock.Offset(, 5).Value = CelStock.Offset(, 5).Value + CelFacture.Offset(, 10).Value
'recherche la ligne de la dernière cellule non vide en colonne A de la
'feuille "Historique Caisse" et se décale sur la ligne vide du dessous
LgCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
'inscrit les différentes valeurs dans l'historique de caisse...
With Sheets("Historique Caisse")
.Range("A" & LgCaisse).Value = Date
.Range("B" & LgCaisse).Value = Time
.Range("C" & LgCaisse).Value = Numfact 'numéro de facture
.Range("D" & LgCaisse).Value = CelFacture.Value 'dénomination
Titre = CelFacture.Value
.Range("E" & LgCaisse).Value = CelFacture.Offset(, 10).Value 'quantité
Qte = CelFacture.Offset(, 10).Value
.Range("F" & LgCaisse).Value = CelFacture.Offset(, 11).Value 'prix
End With
'inscrit les différentes valeurs dans le journal de bord...
With Sheets("Journal de bord")
No_Ligneb = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Range("A" & No_Ligneb).Value = "Sortie vente"
.Range("B" & No_Ligneb).Value = CelFacture.Value
.Range("C" & No_Ligneb).Value = CelFacture.Offset(, 10).Value
.Range("F" & No_Ligneb).Value = Date
.Range("G" & No_Ligneb).Value = Time
End With
'sinon message et fin la aussi !
Else
MsgBox "L'article " & CelFacture.Value & " n'existe pas en stock !", vbExclamation
Exit Sub
End If
'dans le cas où la cellule est vide, on sort de la boucle
Else
Exit For
End If
Next CelFacture
End Sub
Bonjour Theze,
C'est parfait, merci beaucoup.
Pourrais-tu regarder dans la fonction "sortie de stock", afin de ne pas sortir des articles dont le stock serait inférieur à la demande de sortie ou bien dont le stock serait à 0. J'ai essayé de comparer stock et demande, si la demande est supérieure au stock, message box et sortie, mais je n'ai que le message. Voici le code ci-dessous et ma modif.
Dul.
Sub sortie_stock()
'je definie la dernière ligne
derlig = Sheets("Sortie").Cells(Cells.Rows.Count, "A").End(xlUp).Row
derligstock = Sheets("Stock").Cells(Cells.Rows.Count, "A").End(xlUp).Row
derligjourn = Sheets("Journal de bord").Cells(Cells.Rows.Count, "A").End(xlUp).Row
' Sortie ====> Stock
'je parcours les lignes des entr_es
For Each C In Sheets("Sortie").Range("A4:A" & derlig)
'je parcours les lignes des stocks
For Each D In Sheets("Stock").Range("A4:A" & derligstock)
'si article stock = article entr_e alors
If C = D Then
If C.Offset(0, 1) > D.Offset(0, 5) Then
MsgBox "Pas assez d'articles en stock "
End If
'valeur stock + valeur entr_e
D.Offset(0, 5) = D.Offset(0, 5) + C.Offset(0, 1)
End If
Next
Next
' Sortie ====> Journal
derligjourn = derligjourn + 1
'je parcours les lignes des sorties
For Each C In Sheets("Sortie").Range("A4:A" & derlig)
'je m'assure que la sortie n'est pas vide pour eviter une insertion d'une ligne vide
If C <> "" Then
'je saisie que c'est une sortie
Sheets("Journal de bord").Range("A" & derligjourn).Value = "Sortie hors vente"
'je saisie la designation
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 1) = C
'je saisie la quantit_
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 2) = C.Offset(0, 1)
'je saisie la date
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 5) = Date
'heure
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 6) = Time
'j'incremente le numero de ma derniere ligne
derligjourn = derligjourn + 1
End If
Next
'après les entr_es je supprime mes lignes
DLig = Sheets("Sortie").Range("B" & Rows.Count).End(xlUp).Row
' Pour chaque ligne de la dernière ö la 4ème je les supprime
For lig = DLig To 4 Step -1
Rows(lig).Delete
Next
MsgBox "Sortie de stock terminée"
End Sub
bonjour dul
ton code serai plus lisible si tu le mettais entre crochet comme le fait THEZE
Bonjour,
Je suis en week-end sans PC(seulement téléphone) je regarde semaine prochaine !
Bonjour Theze,
Je reviens sur la macro "Valider" qui fonctionne parfaitement tant que les articles sont en stock. Si ce n'est pas le cas, les tests détectent bien que le stock est à zéro ou insuffisant selon les articles, les MsgBox affichent bien leur message mais les "exit sub" situés juste après sont sans effet et la facture est quand même créée et déduite du stock sur les marchandises disponibles, j'ai essayé de remplacer les exit sub par end, d'activer une autre feuille, rien ni fait. Comment pourrait-on annuler la création des factures si un article n'est pas en stock.
Je te remercie pour ton aide.
Dul
Sub Valider()
Dim FeFacture As Worksheet
Dim FeStock As Worksheet
Dim FeHistorique_Caisse As Worksheet
Dim PlgFacture As Range
Dim PlgStock As Range
Dim PlgHistorique_Caisse As Range
Dim CelFacture As Range
Dim CelStock As Range
Dim CelHistorique_Caisse As Range
Dim Article As String
Dim LgCaisse As Long
Dim Flag As Integer
Dim Numfact As String
Dim No_Ligneb As Integer
Dim Titre As String
Dim Qte As Integer
Set FeFacture = Worksheets("Facturation")
Set FeStock = Worksheets("Stock")
Set FeHistorique_Caisse = Worksheets("Historique Caisse")
'recupere numero facture
Numfact = FeFacture.Range("F38").Value
'On vérifie qu'un numéro de facture a bien été attribué dans ("Facturation")
If Numfact = "" Then
Beep
MsgBox "Il manque le numéro de facture !", vbExclamation
Exit Sub
End If
'défini la plage sur la colonne 3 (C) de la feuille "Facturation"
With FeFacture: Set PlgFacture = .Range(.Cells(42, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'défini la plage sur la colonne 1 (A) de la feuille "Stock"
With FeStock: Set PlgStock = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
'défini la plage sur la colonne 3 (C) de la feuille "Historique"
With FeHistorique_Caisse: Set PlgHistorique_Caisse = .Range(.Cells(4, 3), .Cells(.Rows.Count, 3).End(xlUp)): End With
'vérifie si la facture existe déjà dans historique de caisse colonne c pour ne pas soustraire plusieurs fois le stock
For Each CelHistorique_Caisse In PlgHistorique_Caisse
If CelHistorique_Caisse = Numfact Then
MsgBox "La facture numéro '" & Numfact & "' existe déjà !", vbExclamation
Exit Sub 'si la facture existe déjà on sort
End If
Next CelHistorique_Caisse
'On vérifie que les article et leur quantité existent en stock en colonne Cel à partir de C42
For Each CelFacture In PlgFacture
'si la cellule n'est pas vide...
If CelFacture.Value <> "" Then
'bascule le drapeau à 1
Flag = 1
'effectue une recherche dans la feuille Stock en colonne A à partir de A4
Set CelStock = PlgStock.Find(CelFacture.Value, , xlValues, xlWhole)
'si trouvé...
If Not CelStock Is Nothing Then
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est 0, message pas d'article en stock et fin de procédure
If CelStock.Offset(, 6).Value = 0 Then
MsgBox "Il n'y a plus de" & CelFacture.Value & " en stock !", vbExclamation
Exit Sub
End If
'si en colonne G ("Stock Fin") de la feuille "Stock" la valeur est inférieure
'à la quantité saisie en colonne M de la feuille "Facturation", message et fin de procédure
If CelStock.Offset(, 6).Value < CelFacture.Offset(, 10).Value Then
MsgBox "Il n'y a que " & CelStock.Offset(0, 6).Value & " " & CelFacture.Value & " en stock !", vbExclamation
Exit Sub
End If
'incrémente la cellule en colonne F ("Sortie") de la feuille "Stock" de la valeur
'de la cellule en colonne M de la feuille "Facturation"
CelStock.Offset(, 5).Value = CelStock.Offset(, 5).Value + CelFacture.Offset(, 10).Value
'recherche la ligne de la dernière cellule non vide en colonne A de la
'feuille "Historique Caisse" et se décale sur la ligne vide du dessous
LgCaisse = Sheets("Historique Caisse").Cells(Rows.Count, "A").End(xlUp).Row + 1
'inscrit les différentes valeurs dans l'historique de caisse...
With Sheets("Historique Caisse")
.Range("A" & LgCaisse).Value = Date
.Range("B" & LgCaisse).Value = Time
.Range("C" & LgCaisse).Value = Numfact 'numéro de facture
.Range("D" & LgCaisse).Value = CelFacture.Value 'dénomination
Titre = CelFacture.Value
.Range("E" & LgCaisse).Value = CelFacture.Offset(, 10).Value 'quantité
Qte = CelFacture.Offset(, 10).Value
.Range("F" & LgCaisse).Value = CelFacture.Offset(, 11).Value 'prix
End With
'inscrit les différentes valeurs dans le journal de bord...
With Sheets("Journal de bord")
No_Ligneb = .Cells(Rows.Count, "A").End(xlUp).Row + 1
.Range("A" & No_Ligneb).Value = "Sortie vente"
.Range("B" & No_Ligneb).Value = CelFacture.Value
.Range("C" & No_Ligneb).Value = CelFacture.Offset(, 10).Value
.Range("F" & No_Ligneb).Value = Date
.Range("G" & No_Ligneb).Value = Time
End With
'sinon message et fin la aussi !
Else
MsgBox "L'article " & CelFacture.Value & " n'existe pas en stock !", vbExclamation
Exit Sub
End If
'dans le cas où la cellule est vide, on sort de la boucle
Else
Exit For
End If
Next CelFacture
End Sub
Bonjour,
Je viens de faire des tests et chez moi (PC), les "Exit Sub" mettent bien fin à la procédure !
Je n'ai pas de Mac donc, je ne peux pas faire de tests !
Regardes si tu peux faire les tests sur un PC pour voir le comportement.
Comme te le suggère grisan29, utilises les balises "Code", clic sur le bouton puis tu colles ton code entre ces deux balises !
Un code est plus facile à lire quand il est indenté, sinon, on a de la peine à identifier les blocs ! Dommage que les programmeurs Microsoft ne le fassent pas pour VBA de façon automatique comme dans VB.Net !
Bonjour,
Je vais ouvrir un nouveau post pour ces Exit Sub qui fonctionnent sous PC et pas sous Mac.
Les Exits Sub qui concernent directement la feuille "Facturation" (où se trouve la macro) fonctionnent normalement.
Pourrais-tu regarder ci-dessous pour la feuille sortie, celle qui permet de sortir de la marchandise du stock sans facturation, rien ne bloquait la procédure si le stock arrivait à 0 et il passait alors en négatif.
Merci.
Dul
Sub sortie_stock()
'je definie la dernière ligne
derlig = Sheets("Sortie").Cells(Cells.Rows.Count, "A").End(xlUp).Row
derligstock = Sheets("Stock").Cells(Cells.Rows.Count, "A").End(xlUp).Row
derligjourn = Sheets("Journal de bord").Cells(Cells.Rows.Count, "A").End(xlUp).Row
' Sortie ====> Stock
'je parcours les lignes des entr_es
For Each C In Sheets("Sortie").Range("A4:A" & derlig)
'je parcours les lignes des stocks
For Each D In Sheets("Stock").Range("A4:A" & derligstock)
'si article stock = article entr_e alors
If C = D Then
'valeur stock + valeur entr_e
D.Offset(0, 5) = D.Offset(0, 5) + C.Offset(0, 1)
End If
Next
Next
' Sortie ====> Journal
derligjourn = derligjourn + 1
'je parcours les lignes des sorties
For Each C In Sheets("Sortie").Range("A4:A" & derlig)
'je m'assure que la sortie n'est pas vide pour eviter une insertion d'une ligne vide
If C <> "" Then
'je saisie que c'est une sortie
Sheets("Journal de bord").Range("A" & derligjourn).Value = "Sortie hors vente"
'je saisie la designation
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 1) = C
'je saisie la quantit_
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 2) = C.Offset(0, 1)
'je saisie la date
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 5) = Date
'heure
Sheets("Journal de bord").Range("A" & derligjourn).Offset(0, 6) = Time
'j'incremente le numero de ma derniere ligne
derligjourn = derligjourn + 1
End If
Next
'après les entr_es je supprime mes lignes
DLig = Sheets("Sortie").Range("B" & Rows.Count).End(xlUp).Row
' Pour chaque ligne de la dernière ö la 4ème je les supprime
For lig = DLig To 4 Step -1
Rows(lig).Delete
Next
MsgBox "Sortie de stock terminée"
End Sub