Code à modifier
Bonjour tout le monde,
je vous attache un fichier.
Dans la feuille de transaction,
après avoir choisi le code d'article (ItemCode), puis le type d'opération, il devrait attendre la saisie de Quantité (Quantity)
(le macro ne doit pas s'exécuter avant)
Et lorsque je choisis la quantité , le macro doit s'exécuter et produire ce qui suit,
- donc si le type d'opération (Transaction Type) est Sell le nouveau stock (NEWStock) diminue la quantité et si le type est (RETURN) le nouveau stock (NewStock) doit s'augmenter la quantité par rapport au stock d'origine
et le résultat doit se mettre :le sur la même feuille dans le champ Nouveau Stock (NEWStock)
Et encore remplacez la quantité dans la feuille ITems2023 (le nom de la feuille est fo dans le macro) dans le champ Quantité actuelle en stock (Current Quantity in Stock) .. Merci beaucoup.
Bonjour,
la macro se lance au moment où une valeur en colonne 7 est modifiée.
Si vous voulez qu'elle se lance uniquement lorsque la quantité est renseignée alors il suffit de modifier le 7 par un 8 :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.CountLarge > 1 Then Exit Sub
If Target.Row > 2 And Target.Column = 8 Then
Application.EnableEvents = False
Set fo = Sheets("Items2023")Maintenant, s'il faut que la colonne 7 et la colonne 3 soient renseignées alors vous pouvez ajouter ce double test avant le lancement du code :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.CountLarge > 1 Then Exit Sub
If Target.Row > 2 And Target.Column = 7 And Cells(Target.Row,2)<>"" And Cells(Target.Row,7) <>"" Then
Application.EnableEvents = False
Set fo = Sheets("Items2023")Enfin si j'ai bien compris le problème.
@ bientôt
LouReeD
Salut le fil,
Par le début on commença...
Si ton NewStock se cale par rapport au Stock d'origine ton calcul ne sera pas bon puisque le stock d'origine ne change pas. Donc il faut déjà voir cela.
Pour le reste tu remplaces la totalité du code de la Méthode Worksheet_Change par celui-là
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngRow As Long
Dim lstObj As ListObject
Dim lstRowT As ListRow
Dim lstRowR As ListRow
Dim strItemCode As String
' // On travaille sur la cellule quantité
' // J'ai intégré deux tableaux car il vaut mieux leur potentiel.
' // Un Tableau pour le stock et un tableau pour Items2023
Application.EnableEvents = False
Set lstObj = Range("tab_Transaction").ListObject
Set lstRowT = lstObj.ListRows(Target.Row - 1)
If Not Intersect(Target, lstObj.ListColumns("Quantity").Range) Is Nothing Then ' // si on modifie la quantité alors ...
If Not lstRowT Is Nothing Then
' // On sauvegarde l'Item Code
strItemCode = lstRowT.Range(2).Value
If lstRowT.Range(2).Value = vbNullString Then
MsgBox "Le champ Item Code ne doit pas être vide", vbOKOnly Or vbInformation, Application.Name
Target.Value = vbNullString
lstRowT.Range(2).Select
ElseIf lstRowT.Range(3).Value = vbNullString Then
MsgBox "Le champ Description ne doit pas être vide", vbOKOnly Or vbInformation, Application.Name
Target.Value = vbNullString
lstRowT.Range(3).Select
Else
Select Case lstRowT.Range(7) ' // On récupère le type de transaction
Case "Sell"
If lstRowT.Range(6) - lstRowT.Range(8) < 0 Then
Select Case MsgBox("Le nouveau stock passe en négatif" & vbCrLf _
& "Confirmez-vous l'opération?", vbYesNo Or vbQuestion Or vbDefaultButton2, Application.Name)
Case vbYes
lstRowT.Range(12).Value = lstRowT.Range(6) - lstRowT.Range(8)
Case vbNo
End Select
Else
lstRowT.Range(12).Value = lstRowT.Range(6) - lstRowT.Range(8)
End If
Case "Return"
lstRowT.Range(12).Value = lstRowT.Range(6) + lstRowT.Range(8)
Case Else
MsgBox "Vous devez sélectionner une transaction", vbOKOnly Or vbInformation, Application.Name
lstRowT.Range(7).Select
End Select
End If
End If
' // On met à jour le tableau Items23
' // On récupère la ligne du tableau concernée
' // POUR UN BON FONCTIONNEMENT DE LA RECHERCHE LE TABLEAU tab_Item23 NE DOIS PAS CONTENIR DE DOUBLONS ET DOIT ETRE TRIE
If strItemCode <> vbNullString Then
Set lstRowR = basTS.TS_GetListRow(Sheet2.Range("tab_Items23").ListObject, "ItemCode", strItemCode)
If Not lstRowR Is Nothing Then
lstRowR.Range(5).Value = lstRowT.Range(12).Value
End If
End If
End If
Application.EnableEvents = True
End Subet dans un module que tu vas nommer bas_TS tu colles celui-là
' Module : basTS
' Auteur : Jean-Paul (Valtrase)
' Date : 18/09/2022
' Objectif :
' Références :
' Révision du : 18/09/2022
' Motif révision :
' ————————————————————————————————————————————————————————————————————————
' // GetListRow sur une idée de Pierre Fauconnier le : 16/01/2022
' // Retourne une ligne d'un tableau depuis la recherche d'une valeur dans une colonne
' // https://www.developpez.net/forums/blogs/27262-pierre-fauconnier/b5879/excel-vba-modifier-donnees-tableau-formulaire/
Public Function TS_GetListRow(Table As ListObject, ColumnName As String, Value As Variant) As ListRow
Dim Formula As String
Dim Index As Long
If TypeName(Value) = "String" Then Value = """" & Value & """" Else Value = Value * 1
Formula = "iferror(match({value},{table}[{column}],0),0)"
Formula = Replace(Formula, "{value}", Value)
Formula = Replace(Formula, "{table}", Table.Name)
Formula = Replace(Formula, "{column}", ColumnName)
Index = Evaluate(Formula)
If Index > 0 Then Set TS_GetListRow = Table.ListRows(Index)
End FunctionMis à part cette histoire de mise à jour du stock cela devrait faire le travail.
Tiens moi au courant.
Merci énormément Monsieur Jean-Paul,
je dois comprendre le code cependant
Il te reste à ajouter la date svp ..
(Range("A" & Target.Row) = Date 'ou = Now si on veut l'horodate)
ou?
Parfait Monsieur,
mais encore une chose à régler svp,
quand la quantité vendue est saisie, la nouvelle qté de stock change MAIS enocre le stock initial - on parle toujours de la feuille transistion- change, mais non il faut garder l'initial, afain qu'on sauvegarde une historique.
Merci profondément.
Je te remercie énormémement Mr Jean-Paul
J'espere un jour pouvoir t'aider..
Je vais essayer d'apprendre le VBA comme il faut.



