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
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é...
Cdlt.