RE :
Ouf, enfin !
Voici le code que je te propose :
Sub Entreeenstock3_clic()
Dim F As Integer, Ref As Integer, D As Integer, I As Integer, J As Integer, S As Integer
'Coucou, s'il n'y a pas de produit de sélectionné, pas de stockage
If Range("L2").Value = 0 Then
MsgBox "Si ce n'est trop vous demander," & vbNewLine & vbNewLine & "Veuillez incérer les références et leurs quantités.", vbCritical + vbOKOnly, "Coucou Abib"
MsgBox "Ne pas oublier les prix d'achats," & vbNewLine & vbNewLine & "les prix de ventes et les dates de péremptions"
Exit Sub
End If
Application.ScreenUpdating = False
'ThisWorkbook.Unprotect MdPasse
'Sheets("Stock").Visible = True
With Sheets("Entree en Stock")
Ref = .Range("M2").Value
J = .Range("K2").Value
For F = 5 To Ref
D = .Range("C" & F).Value
I = D + 1
S = .Range("D" & F).Value
' Copie de la quantité
Sheets("Stock").Range("A1").Offset(D, 67) = S
' Copie de la quantité existante en stocké par jour
Sheets("Stock").Range("A1").Offset(D, 68) = .Range("A1").Offset(D, J + J + 3)
' Mettre à jour la quantité de produit stocké
Sheets("Stock").Range("BR" & I) = Sheets("Stock").Range("BP" & I) + Sheets("Stock").Range("BQ" & I)
Sheets("Stock").Range("A1").Offset(D, J + J + 3) = Sheets("Stock").Range("BR" & I)
' Mettre à jour le stock existant dans les étalages
'Copie du stock général
Sheets("Stock").Range("A1").Offset(D, 67) = Sheets("Stock").Range("A1").Offset(D, 4)
'Copie de la quantité achetée par le client et la déstocker du stock général
Sheets("Stock").Range("A1").Offset(D, 68) = S
Sheets("Stock").Range("BR" & I) = Sheets("Stock").Range("BP" & I) + Sheets("Stock").Range("BQ" & I)
Sheets("Stock").Range("A1").Offset(D, 4) = Sheets("Stock").Range("BR" & I)
' Mettre à jour les prix d'achat et de vente des produits et dates de péremption
' Prix achat
If .Range("F" & F) = "" Then
MsgBox "Ne pas laisser le tarif vide, même si c'est le même prix."
Exit Sub
End If
Sheets("Stock").Range("A1").Offset(D, 2) = .Range("F" & F)
' Prix vente
If .Range("G" & F) = "" Then
MsgBox "Ne pas laisser le tarif vide, même si c'est le même prix."
Exit Sub
End If
Sheets("Stock").Range("A1").Offset(D, 3) = .Range("G" & F)
' Date de péremption
If .Range("K" & F) = "" Then
MsgBox "Tout produit a une date de péremption, veuillez la mentionner."
Exit Sub
End If
Sheets("Stock").Range("A1").Offset(D, 78) = .Range("K" & F)
Next F
Sheets("Stock").Range("BP2:BR650").ClearContents
.Range("C5:D32,F5:G32,K5:K32").ClearContents
End With
'Sheets("Stock").Visible = False
'ThisWorkbook.Protect MdPasse
Application.ScreenUpdating = True
End Sub
Tu constateras, pour commencer, qu'il est pratiquement deux fois plus court.
Comment j'y suis parvenu me diras tu ? Assez simplement ma foi :
Retiens qu'il est inutile de sélectionner des feuilles puis des cellules pour agir dessus, il suffit de les référencer dans chaque instruction. C'est ce que j'ai fait. Par ailleurs, j'ai condensé tes conditions If...Then car si un message d'erreur apparaît, c'est que la cellule est vide et donc il est inutile de retester dans une autre condition pour sortir de la procédure. Comme les copies de cellules n'opèrent que sur leurs valeurs, j'ai donc remplacé tous les Copy...Paste par un simple signe d'égalité.
Par ailleurs, la macro fonctionne sans déprotéger le classeur ni afficher la feuille Stock, ce qui répond à ton dernier souci. En tout cas ça marche sans erreur, j'ai testé. Si tu as un problème chez toi, il te suffira d'ôter l'apostrophe de commentaires sur les lignes concernées en début puis en fin de procédure. Sinon, n'hésite pas à les supprimer.
Dernier point : vérifie bien que les écritures se font dans les bonnes cellules car j'ai eu un peu de mal à suivre le déroulement, malgré les quelques commentaires que tu as mis et que j'ai conservé pour t'aider à mieux t'y repérer.
Dans l'attente de ton retour.
Bon courage et bonne soirée.
Cordialement.