Enregistrer le format d'une valeur textbox en monétaire

gbstyle

XLDnaute Impliqué
Bonjour, voila je souhaiterai lors de l'enregistrement sur mon tableau que le format nombre soit monétaire
ci joint mon bout de code
Private Sub BtnAenregistrer_Click()
Ref = Me.TxtARefArticles
With Sheets("Base_Articles")
Set trouvé = .Range("TblBaseArticles").Columns(1).Find(Ref, lookat:=xlWhole, LookIn:=xlValues)
If trouvé Is Nothing Then 'il s'agit d'un nouvelle articles
derlig = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'on se positionne sur la dernière ligne
Else 'existe déjà
derlig = trouvé.Row
If MsgBox("Souhaitez vous modifier l'article ?", vbYesNo) = vbNo Then Exit Sub
End If

.Range("A" & derlig) = TxtARefArticles
.Range("B" & derlig) = CboAFamille
.Range("C" & derlig) = CboASousfamille
.Range("D" & derlig) = TxtADesignation
.Range("E" & derlig) = CboAFournisseur
.Range("F" & derlig) = TxtALongueurcolisage
.Range("G" & derlig) = TxtALargeurcolisage
.Range("H" & derlig) = TxtAHauteurcolisage
.Range("I" & derlig) = TxtACréele
.Range("J" & derlig) = TxtANotes
.Range("K" & derlig) = TxtADelaislivraison
.Range("L" & derlig) = TxtAFraistransport
.Range("M" & derlig) = TxtAFacturation
.Range("N" & derlig) = CboAModedegestion
.Range("O" & derlig) = TxtAminicommande
.Range("P" & derlig) = TxtAPrixUnitHT ' => données à afficher en format Euros lors de la saisie dans le text box et lors de l'enregistrement que sont format se mette en monétaire dans le tableau source
J'ai essaye un code avec .NumberFormat = "#,##0.00 $" mais je n'y arrive pas, il me manque une déclaration de variable je pense


End With

End Sub

D'avance merci
 

Dranreb

XLDnaute Barbatruc
J'ai vu que tu avais besoin du cumul des montants, alors fais le à la fin. Découpe en deux instructions le Next Détail, RefCmd
VB:
              Next Détail
          TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
          TR(LR, 17) = TR(LR, 16) * 20 / 100
          TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
          Next RefCmd
 

gbstyle

XLDnaute Impliqué
Je ne comprend pas à quel niveau car la à part mon arrondi de date ca à l'air de fonctionner

VB:
Private Sub Worksheet_Activate()
Dim Données As Collection, TR(), LR&, RefCmd As SsGr, Détail, PremièreLigne As Boolean
Set Données = Gigogne(TableUnique(Me.ListObjects(1), WshSuivCmd), 1)
'Set Données = Gigogne(TableUnique(Me, WshSuivCmd), 1)
ReDim TR(1 To Données.Count, 1 To 18)
For Each RefCmd In Données
    LR = LR + 1
    TR(LR, 1) = RefCmd.Id ' Identification de la commande
    PremièreLigne = True
    For Each Détail In RefCmd.Co
       If Détail(0) = 0 Then
    Rem. Report des infos manuelles de la ligne de facturation qui existait déjà.  TR(LR, col. fact) = Détail(col. fact)
         
         
        TR(LR, 9) = Détail(9)
        TR(LR, 10) = Détail(10)
        TR(LR, 11) = Détail(11)
        TR(LR, 12) = Détail(12)
        TR(LR, 13) = Détail(13)
        TR(LR, 14) = Détail(14)
         

      Else
          If PremièreLigne Then
        Rem. Reproduction des informations de la commande.  TR(LR, col. fact) = Détail(col. commande)
            TR(LR, 2) = Détail(2)
            TR(LR, 3) = Détail(3)
            TR(LR, 4) = Détail(4)
            TR(LR, 5) = Détail(5)
            TR(LR, 6) = Détail(6)
            TR(LR, 7) = Détail(7)
            PremièreLigne = False: End If
        Rem. Cumul des montants de toutes les lignes de commande :
       
     
            TR(LR, 8) = TR(LR, 8) + Détail(12)
            TR(LR, 15) = DateSerial(Year(TR(LR, 13)), Month(TR(LR, 13)) + 1, 1)  'essaye arrondi 30 jour fin de mois
            TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
            TR(LR, 17) = TR(LR, 16) * 20 / 100
            TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
               
          End If: Next Détail, RefCmd
With Me.ListObjects("TblSuivisFacturation")
    If LR < .ListRows.Count Then .ListRows(LR + 1).Range _
       .Resize(.ListRows.Count - LR).Delete xlShiftUp
    '.DataBodyRange.Resize(LR).Value = TR'pour recalculer la feuille complète
    .DataBodyRange.Resize(LR, 18).Value = TR 'pour recalculer les 18première colonne
    End With
End Sub
 

gbstyle

XLDnaute Impliqué
Je n'ai pas réussis à modifier la procédure que tu m'évoque :
Next Détail
TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
TR(LR, 17) = TR(LR, 16) * 20 / 100
TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
Next RefCmd

Par contre j'ai un soucis de calcul, en fonction des données renseigné de la feuille j'ai un soucis pour mon montant de TR(LR16) = Tr(LR,8)+TR(LR11)
Résultat attendus 899.75 = 499.75 (Total HT) + 400 (Frais de port saisie a réception facturation)
Résultat obtenus 699.80 (l'écart correspond total d'un article d'une ligne d'une commande)

J'ai bien réussis notre fameux TR(LR,15)

Je te joint à nouveaux le code mais je n'arrive pas à positionner quel écriture va dans le next détail et le next RefCmd

VB:
Private Sub Worksheet_Activate()
Dim Données As Collection, TR(), LR&, RefCmd As SsGr, Détail, PremièreLigne As Boolean
Dim DatTrv As Date
Set Données = Gigogne(TableUnique(Me.ListObjects(1), WshSuivCmd), 1)
'Set Données = Gigogne(TableUnique(Me, WshSuivCmd), 1)
ReDim TR(1 To Données.Count, 1 To 18)
For Each RefCmd In Données
    LR = LR + 1
    TR(LR, 1) = RefCmd.Id ' Identification de la commande
    PremièreLigne = True
    For Each Détail In RefCmd.Co
       If Détail(0) = 0 Then
    Rem. Report des infos manuelles de la ligne de facturation qui existait déjà.  TR(LR, col. fact) = Détail(col. fact)


        TR(LR, 9) = Détail(9)
        TR(LR, 10) = Détail(10)
        TR(LR, 11) = Détail(11)
        TR(LR, 12) = Détail(12)
        TR(LR, 13) = Détail(13)
        TR(LR, 14) = Détail(14)

      Else
          If PremièreLigne Then
        Rem. Reproduction des informations de la commande.  TR(LR, col. fact) = Détail(col. commande)
            TR(LR, 2) = Détail(2)
            TR(LR, 3) = Détail(3)
            TR(LR, 4) = Détail(4)
            TR(LR, 5) = Détail(5)
            TR(LR, 6) = Détail(6)
            TR(LR, 7) = Détail(7)
            PremièreLigne = False: End If
        Rem. Cumul des montants de toutes les lignes de commande :
       'Next Détail
            DatTrv = TR(LR, 13) + 30
            TR(LR, 15) = DateSerial(Year(DatTrv), Month(DatTrv) + 1, 0)
            TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
            TR(LR, 17) = TR(LR, 16) * 20 / 100
            TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
       'Next RefCmd
   
            TR(LR, 8) = TR(LR, 8) + Détail(12)
    
   
    
          End If: Next Détail, RefCmd
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mais bon sang ! réfléchis un tout petit peu, nom d'une pipe !
Le cumul des montants Détail(12) sur TR(LR, 8) est à laisser bien évidemment juste avant le Next Détail
Et les deux Next remplacent le Next Détail, RefCmd
J'ai vraiment l'impression que tu n'a rien compris à comment ça marche…
 
Dernière édition:

gbstyle

XLDnaute Impliqué
Il est possible que je m'exprime mal aussi et oui tu as raison je crois que je comprend pas en effet mais je ne demande que ca... sinon j'aurai baissé les bras depuis un moment et j'aurai laissé des formules basique sur tableur que je maitrise bien plus
C'est juste dommage que parfois des chose qui te parraisse simple pour toi sont très compliqué a assimiler pour moi en tout cas, tu n'as pas remarquer que j'essayer de mettre un maximum de commentaire dans les procédure afin de me rappeler un peu leur fonctionnement...

Sinon En essayant juste d'ajouter une information d'addition il faut revoir tout le bloc c'est sur que c'est pas simple à comprendre
Un moment on va chercher le cumul des articles avec Détail 12 qui pour moi si j'ai bien compris sont des information cumulé a partir du meme numéro de commande sur la feuille suivi commande
la en l'occurrence je veux ajouter juste une information de la feuille suivi facturation en respectant l'appel des colonnes et ca ne fonctionne pas

La colonne 16 = la 8 +11 de la meme feuille

On arrive a faire des totaux, des pourcentage en appelant une colonne par contre on peut pas en ajouter l'une à l'autre
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Pose des questions si tu ne comprends pas.
En gros:
TableUnique mets, comme son nom l'indique, dans un tableau unique, l'un derrière l'autre, toutes les lignes de facturation préexistantes puis derrière toutes les lignes de commandes, en ajoutant devant une colonne 0 supplémentaire avec 0 pour les factures existantes et 1 pour les lignes de commandes.
Gigogne réorganise tout ça en le classant, comme demandé à la fin lors de son appel, sur la colonne 1 qui est l'identification de la commande dans les 2 tableaux initiaux. Il renvoie ça dans une collection d'objets de type SsGr. Ceux ci ont une propriété Id qui est la valeur de ce critère de regroupement, donc la réf commande, et une propriété Co qui est à son tour une collection. Chaque membre de cette dernière collection est une table à une dimension de toutes les valeurs d'une ligne de détail. On a donc pour chaque réf commande d'abord l'ancienne ligne de facturation, si elle existait déjà, avec Détail(0) = 0, ensuite un certain nombre de lignes de commandes, toutes avec Détail(0) = 1, mais ça on n'a pas besoin de le tester: si ce n'est pas l'ancienne ligne de facture, c'est forcément une des lignes de commande. Est-ce que tu comprends mieux le processus d'exploration à deux niveaux de l'ensemble ?
Dans le code joint au poste #382 tu utilise TR(LR, 8) alors qu'il n'est même plus calculé correctement vu que l'instruction qui calculait ce cumul tu l'as mise après, à un endroit complètement idiot, au lieu de la laisser dans la boucle de traitement de toutes les lignes détail des commandes, où elle était la seule à devoir y rester.
Détail(12) est le montant de la ligne de commande. On doit additionner sur TR(LR, 8) les montants de toutes les lignes de commande associées à la réf. commande, donc celui de chacune d'elles en les parcourant toutes, l'une après l'autre. Mais c'est la seule chose à faire à chaque ligne de commande ! Tes infos des dernière colonnes, il ne faut les mettre qu'une fois, à la fin, pour la ligne de facture en cours d'élaboration, seulement quand on a fini de cumuler en TR(LR, 8) les montants de toutes les lignes de commande, et qu'on y a donc obtenu le montant total. C'est à dire après le End If et le Next Détail, mais avant le Next RefCmd. On ne peut donc plus garder le Next Détail, RefCmd, qui était une contraction de Next Détail suivi de Next RefCmd, parce qu'il y a ces instructions pour les colonnes de fin à mettre entre le Next Détail qui termine la petite boucle interne d'exploration de toutes les lignes de commande attachées au RefCmd et le Next RefCmd qui termine la grande boucle de chaque ligne de facture.
 
Dernière édition:

gbstyle

XLDnaute Impliqué
Bonjour Dranreb, merci pour ces explication, même si je n'ai pas encore tout assimiler sur le processus à deux niveaux de l'ensemble.
Malgré plusieurs essais je n'arrive pas à avoir le résultat escompté comme tu me le demande dans ton post précédent
Le seul résultat correct que j'arrive à avoir est avec ceci : j'ai bien mon total correct c'est l'objectif
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim Données As Collection, TR(), LR&, RefCmd As SsGr, Détail, PremièreLigne As Boolean
Dim DatTrv As Date
Set Données = Gigogne(TableUnique(Me.ListObjects(1), WshSuivCmd), 1)
'Set Données = Gigogne(TableUnique(Me, WshSuivCmd), 1)
ReDim TR(1 To Données.Count, 1 To 18)
For Each RefCmd In Données
    LR = LR + 1
    TR(LR, 1) = RefCmd.Id ' Identification de la commande
    PremièreLigne = True
    For Each Détail In RefCmd.Co
       If Détail(0) = 0 Then
    Rem. Report des infos manuelles de la ligne de facturation qui existait déjà.  TR(LR, col. fact) = Détail(col. fact)

        TR(LR, 9) = Détail(9)
        TR(LR, 10) = Détail(10)
        TR(LR, 11) = Détail(11)
        TR(LR, 12) = Détail(12)
        TR(LR, 13) = Détail(13)
        TR(LR, 14) = Détail(14)
        DatTrv = TR(LR, 13) + 31
        TR(LR, 15) = DateSerial(Year(DatTrv), Month(DatTrv) + 1, 0)
      
      Else
   
          If PremièreLigne Then
        Rem. Reproduction des informations de la commande.  TR(LR, col. fact) = Détail(col. commande)
            TR(LR, 2) = Détail(2)
            TR(LR, 3) = Détail(3)
            TR(LR, 4) = Détail(4)
            TR(LR, 5) = Détail(5)
            TR(LR, 6) = Détail(6)
            TR(LR, 7) = Détail(7)
          
            PremièreLigne = False: End If
        Rem. Cumul des montants de toutes les lignes de commande :
            TR(LR, 8) = TR(LR, 8) + Détail(12)
          
          
            TR(LR, 16) = TR(LR, 8) + TR(LR, 11)
            TR(LR, 17) = TR(LR, 16) * 20 / 100
            TR(LR, 18) = TR(LR, 16) + TR(LR, 17)
     
        End If: Next Détail, RefCmd
With Me.ListObjects("TblSuivisFacturation")
    If LR < .ListRows.Count Then .ListRows(LR + 1).Range _
       .Resize(.ListRows.Count - LR).Delete xlShiftUp
    '.DataBodyRange.Resize(LR).Value = TR'pour recalculer la feuille complète
    .DataBodyRange.Resize(LR, 18).Value = TR 'pour recalculer les 18première colonne
    End With
End Sub
 

gbstyle

XLDnaute Impliqué
Ci joint mes modif en valeur TBx : je n'ai pas obligation de renseigné tout les champ
Est ce comme cela que tu voyais les choses.

'TVLF(1, 2) = CDate(Me.TBxDate.Text)
'TVLF(1, 3) = Me.TBxEnregistrepar.Text
'TVLF(1, 5) = Me.TBxDelailivraison.Text
'TVLF(1, 6) = CCur(Me.TBxFraistransport.Text)
'TVLF(1, 7) = CDate(Me.TBxDatelivestime.Text)
'TVLF(1, 8) = CCur(Me.TBxTotalHT.Text)
'TVLF(1, 9) = Me.TBxBL.Text
'TVLF(1, 10) = CDate(Me.TBxdatelivconfirme.Text)
'TVLF(1, 11) = CCur(Me.TBxfraisdeport.Text)
'TVLF(1, 13) = CDate(Me.TBxdatefacturation.Text)

TVLF(1, 2) = CDate(ValeurTBx(Me.TBxDate))
TVLF(1, 3) = ValeurTBx(Me.TBxEnregistrepar)
TVLF(1, 5) = ValeurTBx(Me.TBxDelailivraison)
TVLF(1, 6) = CCur(ValeurTBx(Me.TBxFraistransport))
TVLF(1, 7) = CDate(ValeurTBx(Me.TBxDatelivestime))
TVLF(1, 8) = CCur(ValeurTBx(Me.TBxTotalHT))
TVLF(1, 9) = ValeurTBx(Me.TBxBL)
TVLF(1, 10) = CDate(ValeurTBx(Me.TBxdatelivconfirme))
TVLF(1, 11) = CCur(ValeurTBx(Me.TBxfraisdeport))
TVLF(1, 13) = CDate(ValeurTBx(Me.TBxdatefacturation))



'Range("N" & derlig) = ValeurTBx(TBxdatefacturation.Text)
'TVLF(1, 14) = Range.ValeurTBx(Me.TBxreglementeffectue.Text)

If LCouF = 0 Then
CLsF.ValeursVers TVLF
CLsF.Lignes.Add.Range.Resize(, 14).Value = TVLF
CLsF.Actualiser
'Me.LabNbfournisseur = CLsF.Lignes.Count
'Set DicF = DicoSujet(CLsF.Item(CBxFournisseur).SujetBdD)
Else
CLsF.Lignes(LCouF).Range.Resize(, 14).Value = TVLF

End If

End Sub[/code]
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Tu peux utliser ValeurTBx pour toutes les TextBox. Précise comme second paramètre vbDate pour les dates et vbCurrency pour les montants. La fonction s'occupera des conversions de donnée et des TextBox vides.

Le calcul des lignes de factures n'est toujours pas bon: Les Tr(LR, 16 à 18) sont toujours garnis inutilement sur la même ligne LR autant de fois qu'il y a de lignes de commandes, avec un montant total faux jusqu'à l'avant dernière puisque son calcul n'est pas terminé. Je t'ai dit de transformer Next Détai, RefCmd en Next Détail suivi en dessous de Next RefCmde puis de mettre ces instructions entre le Next Détail et le Next RefCmd.

Remarque: peut être que ce serait plus clair pour toi, au lieu de
Rem. Cumul des montants de toutes les lignes de commande :
de mettre :
Rem. Cumul en colonne 8 du montant de cette ligne de commande, que ce soit la première ou non :
 
Dernière édition:

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG