Microsoft 365 Code VBA Bon Commande

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

mld.sebastien

XLDnaute Junior
Bonjour,

Je cherche un code VBA pour autant de ligne dans le bon de commande.

Pour chaque textbox : Tbx_Quantité , Tbx_Prix qui ce multiplie et donne un Montant en Tbx_Montant.
Et à la fin un Tbx_Total en additionnant les Montant.

Je l'ai fait pour chaque ligne comme cela :

VB:
Private Sub Tbx_Prix1_Change()
    Tbx_Montant1.Value = Format(Tbx_Quantie1.Value * Tbx_Prix1.Value, "#,##0.00 €")
End Sub

Private Sub Tbx_Montant1_Change()
    Tbx_Total.Value = Format(Tbx_Montant1.Value + Tbx_Montant2.Value, "#,##0.00 €")
End Sub

Je cherche si il y pas plus simple ??

@job75 m'avait super bien aider à un moment je le remercie d'ailleurs, j'utilise toujours tous le temps ses codes.

Cordialement.
 
Solution
Hello

remplace le code du combo par celui ci
VB:
Private Sub Lst_NomPrénom_Change() 'lorsque la selection change dans le combo
    If Me.Lst_NomPrénom.ListIndex = -1 Then 'si il n'y a pas de selection OU qu'il y a une saisie ne correspondant pas à la liste du combo
        Me.Tbx_DateAnniverssaire = " "
        Me.Tbx_Adresse = " "
        Me.Tbx_Téléphone = " "
        Me.Tbx_Mail = " "
        Exit Sub
    End If
    With Sheets("Lst_Clients") 'avec la feuille
        With .ListObjects("Lst_tab_Clients") 'avec la table
            Set trouve = .ListColumns("Nom Prénom").Range.Find(Me.Lst_NomPrénom, lookat:=xlWhole, LookIn:=xlValues) 'on cherche le Nom Prénom dans la colonne
            If Not trouve Is Nothing Then 'si on l'a trouvé...
y a pas mal de boulot à mon avis

1) déjà à l'initialize.. remplir un combo avec une liste complète pour ensuite supprimer les doublons.. euh...
pourquoi ne pas remplir directement que avec les nouveaux éléments ?
et tant qu'à faire.. utiiser la structure ListObjects (Table structurée)

VB:
Private Sub UserForm_Initialize()
    With Sheets("Lst_Clients").ListObjects("Lst_tab_Clients")
        For i = 1 To .ListRows.Count
            Me.Lst_NomPrénom = .DataBodyRange(i, 4)
            If Me.Lst_NomPrénom.ListIndex = -1 Then Me.Lst_NomPrénom.AddItem Me.Lst_NomPrénom
        Next i
        'Lst_NomPrénom.List = .ListColumns(4).DataBodyRange.Value
    End With
    Me.Lst_NomPrénom.ListIndex = -1
    'Call Lst_NomPrénomSupprimerDoublons(Lst_clients)
End Sub

2) l'enregistrement d'un bon de commande dans UNE seule ligne.. c'est pas une bonne idée..
il vaut mieux créer une ligne PAR ligne de produit, en mettant le numéro de commande
==> plus facile à traiter pour remplir le bon de commande par la suite, voire modifier /Supprimer UNE ligne de la commande

3) pour la gestion des Textbox qui font "tous" la meme chose , il faut sans doute passer par un module de classe..
 
après. si tu es SUR de ne jamais avoir plus de 9 lignes de ref.....
VB:
Private Sub Tbx_Prix1_Change()
    Tbx_Montant1.Value = Format(Tbx_Quantie1.Value * Tbx_Prix1.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix2_Change()
    Tbx_Montant2.Value = Format(Tbx_Quantie2.Value * Tbx_Prix2.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix3_Change()
    Tbx_Montant3.Value = Format(Tbx_Quantie3.Value * Tbx_Prix3.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix4_Change()
    Tbx_Montant4.Value = Format(Tbx_Quantie4.Value * Tbx_Prix4.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix5_Change()
    Tbx_Montant5.Value = Format(Tbx_Quantie5.Value * Tbx_Prix5.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix6_Change()
    Tbx_Montant6.Value = Format(Tbx_Quantie6.Value * Tbx_Prix6.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix7_Change()
    Tbx_Montant7.Value = Format(Tbx_Quantie7.Value * Tbx_Prix7.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix8_Change()
    Tbx_Montant8.Value = Format(Tbx_Quantie8.Value * Tbx_Prix8.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix9_Change()
    Tbx_Montant9.Value = Format(Tbx_Quantie9.Value * Tbx_Prix9.Value, "#,##0.00 €")
    UpdateTotal
End Sub

Private Sub UpdateTotal()
    On Error Resume Next
    Total = 0
    For i = 1 To 9
        Me.Controls("Tbx_Montant" & i) = Format(Me.Controls("Tbx_Quantie" & i).Value * Me.Controls("Tbx_Prix" & i).Value, "#,##0.00 €")
        Total = CDbl(Total) + CDbl(Me.Controls("Tbx_Montant" & i))
    Next i
    Me.Tbx_Total = Format(Total, "#,##0.00 €")
End Sub
 
y a pas mal de boulot à mon avis

1) déjà à l'initialize.. remplir un combo avec une liste complète pour ensuite supprimer les doublons.. euh...
pourquoi ne pas remplir directement que avec les nouveaux éléments ?
et tant qu'à faire.. utiiser la structure ListObjects (Table structurée)

VB:
Private Sub UserForm_Initialize()
    With Sheets("Lst_Clients").ListObjects("Lst_tab_Clients")
        For i = 1 To .ListRows.Count
            Me.Lst_NomPrénom = .DataBodyRange(i, 4)
            If Me.Lst_NomPrénom.ListIndex = -1 Then Me.Lst_NomPrénom.AddItem Me.Lst_NomPrénom
        Next i
        'Lst_NomPrénom.List = .ListColumns(4).DataBodyRange.Value
    End With
    Me.Lst_NomPrénom.ListIndex = -1
    'Call Lst_NomPrénomSupprimerDoublons(Lst_clients)
End Sub

2) l'enregistrement d'un bon de commande dans UNE seule ligne.. c'est pas une bonne idée..
il vaut mieux créer une ligne PAR ligne de produit, en mettant le numéro de commande
==> plus facile à traiter pour remplir le bon de commande par la suite, voire modifier /Supprimer UNE ligne de la commande

3) pour la gestion des Textbox qui font "tous" la meme chose , il faut sans doute passer par un module de classe..
Pour le petit 2 cela engendre une liste de produit avec une référence, une articles, quantité, prix, montant pour chaque ligne exemple dans le tableau excel Evt_Achat et à la fin un prix total si je peux améliorer la chose oui en cherche de code exemple et le petit 3 je comprend pas trop une gestion de texbox qui ce rajouter au fil de mon bon de commande ces c’a?
 
après. si tu es SUR de ne jamais avoir plus de 9 lignes de ref.....
VB:
Private Sub Tbx_Prix1_Change()
    Tbx_Montant1.Value = Format(Tbx_Quantie1.Value * Tbx_Prix1.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix2_Change()
    Tbx_Montant2.Value = Format(Tbx_Quantie2.Value * Tbx_Prix2.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix3_Change()
    Tbx_Montant3.Value = Format(Tbx_Quantie3.Value * Tbx_Prix3.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix4_Change()
    Tbx_Montant4.Value = Format(Tbx_Quantie4.Value * Tbx_Prix4.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix5_Change()
    Tbx_Montant5.Value = Format(Tbx_Quantie5.Value * Tbx_Prix5.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix6_Change()
    Tbx_Montant6.Value = Format(Tbx_Quantie6.Value * Tbx_Prix6.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix7_Change()
    Tbx_Montant7.Value = Format(Tbx_Quantie7.Value * Tbx_Prix7.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix8_Change()
    Tbx_Montant8.Value = Format(Tbx_Quantie8.Value * Tbx_Prix8.Value, "#,##0.00 €")
    UpdateTotal
End Sub
Private Sub Tbx_Prix9_Change()
    Tbx_Montant9.Value = Format(Tbx_Quantie9.Value * Tbx_Prix9.Value, "#,##0.00 €")
    UpdateTotal
End Sub

Private Sub UpdateTotal()
    On Error Resume Next
    Total = 0
    For i = 1 To 9
        Me.Controls("Tbx_Montant" & i) = Format(Me.Controls("Tbx_Quantie" & i).Value * Me.Controls("Tbx_Prix" & i).Value, "#,##0.00 €")
        Total = CDbl(Total) + CDbl(Me.Controls("Tbx_Montant" & i))
    Next i
    Me.Tbx_Total = Format(Total, "#,##0.00 €")
End Sub
Oui j'aurais fait cela mais j'ai un doute sur le nombre de ligne je pense plutôt vouloir faire une incrémente de ligne au besoin . Je cherche des exemple pour voir les différences.
 
voici une version avec un module de classe

on utilise les propriétés "Tag" des controls
les quantités et prix sont taggés "Numérique" et les montant sont taggés "Monétaire"

j'ai aussi taggé les deux textbox de Date==> un clic droit sur ces controls t'ouvre un calendrier pour saisir la date
 
voici une version avec un module de classe

on utilise les propriétés "Tag" des controls
les quantités et prix sont taggés "Numérique" et les montant sont taggés "Monétaire"

j'ai aussi taggé les deux textbox de Date==> un clic droit sur ces controls t'ouvre un calendrier pour saisir la date
Merci beaucoup, ça fonctionne. Vais voir si je peu pas faire un autre userform pour créer mais référencer et article avec tableau et faire appel à cela dans la case référencer et article de mon bon commande.

Merci.
 
voici une version avec un module de classe

on utilise les propriétés "Tag" des controls
les quantités et prix sont taggés "Numérique" et les montant sont taggés "Monétaire"

j'ai aussi taggé les deux textbox de Date==> un clic droit sur ces controls t'ouvre un calendrier pour saisir la date
Es que cette partis du code peu être plus simple ???

VB:
  'Tableau Donnée_Macro
    With Sheets("DONNEE_MACRO")
        .Range("D13").Value = Lst_NomPrénom.Value 'Nom Prénom
        .Range("D14").Value = Text_DateCommande.Value 'Date Commande
        .Range("D15").Value = Tbx_Reference1.Value & vbCrLf & Tbx_Reference2 & vbCrLf & Tbx_Reference3 'Réference
        .Range("D16").Value = Tbx_Articles1.Value & vbCrLf & Tbx_Articles2.Value & vbCrLf & Tbx_Articles3.Value 'Articles
        .Range("D17").Value = Tbx_Quantite1.Value & vbCrLf & Tbx_Quantite2.Value & vbCrLf & Tbx_Quantite3.Value 'Quantié
        .Range("D18").Value = Format(Tbx_Prix1.Value, "#,##0.00 €") & vbCrLf & Format(Tbx_Prix2.Value, "#,##0.00 €") & vbCrLf & Format(Tbx_Prix3.Value, "#,##0.00 €") 'Prix
        .Range("D19").Value = Format(Tbx_Quantite1.Value * Tbx_Prix1.Value, "#,##0.00 €") & vbCrLf & Format(Tbx_Quantite2.Value * Tbx_Prix2.Value, "#,##0.00 €") & vbCrLf & Format(Tbx_Quantite3.Value * Tbx_Prix3.Value, "#,##0.00 €") 'Total
    End With
Car je dois rajouter 10 fois ces informations dans .Range("D15").Value - .Range("D16").Value - .Range("D17").Value - .Range("D18").Value et .Range("D19").Value
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
252
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
80
Réponses
2
Affichages
409
Réponses
3
Affichages
241
Retour