Exit Sub sans effet avec mac 2011, OK avec PC

Bonjour,

Les Exit Sub de la macro ci-dessous fonctionnent sous PC mais restent sans effet avec Mac 2011. Seuls les Exit Sub en rapport direct avec la feuillle "Facturation" où se trouve la macro sont pris en compte avec Mac 2011. La macro effectue la mise à jour des stocks en fonction des marchandises visées par la facture, puis conserve une trace des mouvements. Les Exit Sub concernés servent à interrompre la mise à jour des stocks si la marchandise n'est plus en stock ou en nombre insuffisant. Quelqu'un aurait-il une solution.

Merci pour votre 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

        If Flag = 1 Then

            MsgBox "mise à jour du stock effectuée"

      End If

End Sub

Bonjour,

A tester...

Option Explicit

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
        GoTo exit_Handler
    End If
    'défini la plage sur la colonne 3 (C) de la feuille "Facturation"
    Set PlgFacture = FeFacture.Range(Cells(42, 3), Cells(Rows.Count, 3).End(xlUp))
    'défini la plage sur la colonne 1 (A) de la feuille "Stock"
    Set PlgStock = FeStock.Range(Cells(4, 1), Cells(Rows.Count, 1).End(xlUp))
    'défini la plage sur la colonne 3 (C) de la feuille "Historique"
    Set PlgHistorique_Caisse = FeHistorique_Caisse.Range(Cells(4, 3), Cells(Rows.Count, 3).End(xlUp))
    '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
            GoTo exit_Handler    '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
                    GoTo exit_Handler
                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
                    GoTo exit_Handler
                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
                GoTo exit_Handler
            End If
            'dans le cas où la cellule est vide, on sort de la boucle
        Else
            Exit For
        End If
    Next CelFacture

    If Flag = 1 Then
        MsgBox "mise à jour du stock effectuée"
    End If

exit_Handler:
    Set PlgFacture = Nothing: Set PlgStock = Nothing: Set PlgHistorique_Caisse = Nothing
    Set FeFacture = Nothing: Set FeStock = Nothing: Set FeHistorique_Caisse = Nothing
    Exit Sub

End Sub

Bonjour Jean-Eric,

Merci pour ton aide. La macro provoque une erreur 1004 avec le message suivant: La méthode "Range" de l'objet "Worksheet" a échoué.

Dans le code la ligne qui définit la plage sur la colonne 1 de la feuille "Stock" apparait sur fond jaune:

Set PlgStock = FeStock.Range(Cells(4, 1), Cells(Rows.Count, 1).End(xlUp))

Voici en PJ le fichier complet.

Dul

Re,

Voir fichier en retour.

Cdlt.

Rebonjour,

Merci pour ce nouveau fichier. Voici le résultat des essais:

-Lorsque tous les articles sont en stock tout fonctionne, les marchandises de la facture sont débitées du stock, les mouvements enregistrés sur le journal de bord et l'historique de caisse.

-Lorsque qu'un article n'est plus en stock (ou en nombre insuffisant) et que les autres articles de la facture (en stock ceux là) se trouvent après lui, tout fonctionne, rien n'est débité du stock, aucun mouvement n'est enregistré, le processus s'arrête.

-Lorsqu'un article n'est plus en stock (ou en nombre insuffisant) et que les autres articles de la facture (en stock ceux là) se trouvent avant lui, il y a un problème: les articles disponibles sont déduits du stock et les mouvements enregistrés jusqu'à arriver sur la ligne de l'article manquant. Comment empêcher le processus déstockage + enregitrement des mouvements de la facture si le moindre article fait défaut. Je pensais que cela venait des Exit Sub... mais il n'y en a plus.

Voici ton fichier en PJ, j'ai juste remis les "é" où ils avaient sauté pour que tout fonctionne. Merci pour ton aide.

Dul

Re,

Je suis principalement intervenu pour ton souci avec exit sub (que je ne comprends pas d'ailleurs).

Et tu as indiqué que la procédure fonctionnait sous PC.

Mais ce n'est pas apparemment le cas. Tes nouvelles questions doivent faire l'objet d'un nouveau fil.

Il y a de plus un petit souci de compatibilité...

snip 20170508191401

Cdlt.

Rechercher des sujets similaires à "exit sub effet mac 2011"