Code à modifier

Bonjour tout le monde,

je vous attache un fichier.

23invoices-j3.xlsm (104.44 Ko)

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

Merci LouReeD,

j'ai auparavant changé , la colonne en 8

If Target.Row > 2 And Target.Column = 8 Then

mais , j'ai recu un autre probleme

err3 err3 b

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 Sub

et 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 Function

Mis à part cette histoire de mise à jour du stock cela devrait faire le travail.

Tiens moi au courant.

10invoices-j3.xlsm (93.67 Ko)

Merci énormément Monsieur Jean-Paul,

je dois comprendre le code cependant . C'est beaucoup plus compliqué que le premier..

Il te reste à ajouter la date svp ..

(Range("A" & Target.Row) = Date 'ou = Now si on veut l'horodate)

ou?

Salut le fil

Tu peux rajouter la date ou autre à ce niveau

image

L'objet lstRowT renvoie la ligne complète du tableau par rapport à la cellule active, tu peux modifier les valeurs en indiquant le numéro de colonne lstRowT.Range(1) correspond à la colonne 1 (Date) etc...

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.

C'est une erreur de ma part, mais il faut essayer de comprendre pour pouvoir modifier ensuite

image

Il te faut remplacer les lstRowT.Range(6) par lstRowT.Range(12)

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.

Rechercher des sujets similaires à "code modifier"