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

230factu-gestion.xlsm (196.70 Ko)

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

101factu-gestion.xlsm (215.50 Ko)

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
Rechercher des sujets similaires à "facturation gestion stock"