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

gbstyle

XLDnaute Occasionnel
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
Vérifiez au moins si votre TextBox contient bien un texte convertible en Currency !
Mettez
If IsNumeric(TxtAPrixUnitHT.Text) Then .Range("P" & derlig).Value = CCur(TxtAPrixUnitHT.Text) Else .Range("P" & derlig).Value = Empty
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Faites venir un modèle de Private Sub TxtAPrixUnitHT_KeyPress
pour y corriger la frappe d'un point en virgule notamment.
If Chr$(KeyAscii) = "." Then KeyAscii = Asc(",")
Parce que chez nous la tentative de convertir en Currency un texte contenant des chiffres et un point ça bloque toujours. (en Amérique probablement pas et des virgules seraient ignorées puisque contrairement à nous où c'est un espace, c'est le séparateur de milliers)
 
Dernière édition:

gbstyle

XLDnaute Occasionnel
Bonjour
je n'arrive pas à incrémenter votre code dans le miens j'ai toujour une erreur d'éxecution, est il possible que vous m'aidiez à l'incorporer car je n'assimile pas tout a fait ce que vous me demandez.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
If IsNumeric(TxtAPrixUnitHT.Text) Then .Range("P" & derlig).Value = CCur(TxtAPrixUnitHT.Text) Else .Range("P" & derlig).Value = Empty
''''''''''''''''''''''''''''''''''''''''
Private Sub TxtAPrixUnitHT_KeyPress
pour y corriger la frappe d'un point en virgule notamment.
If Chr$(KeyAscii) = "." Then KeyAscii = Asc(",")
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


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
End With

End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Il manque des paramètres à la procédure de l'évènement KeyPress de la TextBox.
Faites en venir le modèle exact à l'aide des deux larges listes déroulantes qui surmontent la fenêtre de code. (À gauche sélectionnez TxtAPrixUnitHT et à droite KeyPress)
Et à la fin n'affectez plus directement le texte de la textbox mais sa conversion en Currency.
Vos ComboBox me donnent à penser que vous auriez intérêt à utiliser mon objet ComboBoxLiées.
En remplaçant la TxtARefArticles aussi par une CboARefArticles (enfin moi je l'appellerais CBxARefArticles dans ma codification des trigrammes d'objets)
 
Dernière édition:

gbstyle

XLDnaute Occasionnel
Oula je crois que vous avez surestimé le petit novice que je suis, je dois avoué que vos explication me déplace totalement
malgré quelque essais je vous joint une copie de mon fichier peut être que cela sera un peu plus clair.

Je vous remercie par avance si vous pouvez m'aider à cette mise en forme.
 

Dranreb

XLDnaute Barbatruc
J'ai dit plusieurs choses. Qu'est-ce que vous n'avez pas compris ?
Ce n'est pas une question de mise en forme c'est une question de mise au bon type de donnée. D'ailleurs il me semble qu'il manque aussi des CDbl pour convertir en nombre certaines TextBox.
Le modèle de procédure ayant été installé à l'aide des listes déroulantes "Objet" et "Procédure":
VB:
Private Sub TxtAPrixUnitHT_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = Asc(".") Then KeyAscii = Asc(",")
End Sub
Et à la fin des affectations :
VB:
    If IsNumeric(TxtAPrixUnitHT.Text) Then
      .Range("P" & derlig) = CCur(TxtAPrixUnitHT.Text)
    ElseIf TxtAPrixUnitHT.Text = "" Then
      .Range("P" & derlig) = Empty
    Else
      .Range("P" & derlig) = "(" & TxtAPrixUnitHT.Text & ")"
      End If
Pour ne pas refaire ce cirque pour toutes les TextBox concernées vous pouvez écrire cette procédure :
VB:
Private Function ValeurTBx(ByVal TBx As MSForms.TextBox)
If IsNumeric(TBx.Text) Then
  ValeurTBx = CDbl(TBx.Text)
ElseIf TBx.Text = "" Then
  ValeurTBx = Empty
Else: ValeurTBx = TBx.Text: End If
End Function
Comme ça il suffira de faire :
VB:
.Range("F" & derlig) = ValeurTBx(TxtALongueurcolisage)
 
Dernière édition:

gbstyle

XLDnaute Occasionnel
Merci cela fonctionne, j'aimerai cependant savoir si vous pouvez vérifiez que j'ai bien adapté votre code sur le fichier.
Par contre j'ai un petit soucis lors d'un double clic dans ma list view je fait apparaitre mes champ pour une éventuelle modification de la fiche dans le formulaire. Tout les champs sont ok sauf le champs prixunit
 

Dranreb

XLDnaute Barbatruc
Ben oui vous ne rapatriez pas la colonne P dans la TxtAPrixUnitHT
Par ailleurs les dimensions de colisage sont toujours encore enregistrées en type de donnée texte
 

gbstyle

XLDnaute Occasionnel
c'est normal je n'ai pas mis à jour encore les donnée colisage, par contre je ne comprend pas car je vois bien le rapatriement de la colonne P ou alors je ne regarde pas au bon endroit
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous devriez joindre à nouveau votre fichier.
Je crois que c'est dans celui ci que vous voudriez pouvoir mettre à jour vos articles en les cherchant par n'importe quel critère parmi les colonnes de tête, et pour lesquels il faudrait des ComboBox…
 

gbstyle

XLDnaute Occasionnel
Bonjour Danreb non c'était sur une autre de mes demandes :
affichage d'une concatenation de valeur dans une combobox

Mon problème est pour une question de mise en forme et de confidentialité je suis obligé de diminuer un peu les infos, le userform d'origine et donc a chaque modification comme tu me l'as dis sur mon autre sujet j'ai des mises à jour pas top.
Est il possible que je te fasse parvenir en Pv la base global que tu y jette un œil sur l'architecture car à te lire je crois qu'on pourrais grandement simplifié sont fonctionnement
 

Dranreb

XLDnaute Barbatruc
Mettez simplement des infos bidon dans la base, ça devrait aller, non ?

Un modèle de mise à jour, avec objet ComboBoxLiées, un peu établi à l'aveugle :
VB:
Option Explicit
Private WithEvents CL As ComboBoxLiées, LCou As Long, TVL()

Private Sub UserForm_Initialize()
Set CL = Création.ComboBoxLiées
CL.Plage [TblBaseArticles]
CL.Add CBxRefArticle, 1
CL.Add CBxFamille, 2
CL.Add CBxSousFamille, 3
CL.Add CBxDésignation, 4
CL.Add CBxFournisseur, 5
CL.CouleurSympa
CL.Actualiser
End Sub

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 1 Then Exit Sub
LCou = 0
ReDim TVL(1 To 1, 1 To 16)
GarnirAutresContrôles
End Sub

Private Sub CL_BingoUn(ByVal Ligne As Long)
LCou = Ligne
TVL = CL.Lignes(LCou).Range.Value
GarnirAutresContrôles
End Sub

Private Sub GarnirAutresContrôles()
TBxLongueurColisage.Text = TVL(1, 6)
TBxLargeurColisage.Text = TVL(1, 7)
TVL(1, 8) = TBxHauteurColisage.Text
TBxCrééLe = TVL(1, 9)
TBxNotes.Text = TVL(1, 10)
TBxDelaisLivraison.Text = TVL(1, 11)
TBxFraisTransport.Text = TVL(1, 12)
TBxFacturation.Text = TVL(1, 13)
CBxModeDeGestion.Text = TVL(1, 14)
TBxMiniCommande.Text = TVL(1, 15)
TBxPrixUnitHT.Text = TVL(1, 16)
End Sub

Private Sub CBnEnregistrer_Click()
TVL(1, 6) = ValeurTBx(TBxLongueurColisage)
TVL(1, 7) = ValeurTBx(TBxLargeurColisage)
TVL(1, 8) = ValeurTBx(TBxHauteurColisage)
TVL(1, 9) = Now
TVL(1, 10) = ValeurTBx(TBxNotes)
TVL(1, 11) = ValeurTBx(TBxDelaisLivraison)
TVL(1, 12) = ValeurTBx(TBxFraisTransport)
TVL(1, 13) = ValeurTBx(TBxFacturation)
TVL(1, 14) = ValeurTBx(CBxModeDeGestion)
TVL(1, 15) = ValeurTBx(TBxMiniCommande)
TVL(1, 16) = ValeurTBx(TBxPrixUnitHT, TypDon:=vbCurrency)
If LCou = 0 Then
   CL.ValeursVers TVL
   CL.Lignes.Add.Range.Value = TVL
   CL.Actualiser
Else
   CL.Lignes(LCou).Range.Value = TVL
   End If
End Sub
Private Function ValeurTBx(ByVal TBx As MSForms.TextBox, Optional ByVal TypDon As VbVarType = vbDouble)
If IsNumeric(TBx.Text) And TypDon <> vbString Then
   If TypDon = vbCurrency Then ValeurTBx = CCur(TBx.Text) Else ValeurTBx = CDbl(TBx.Text)
ElseIf TBx.Text = "" Then
   ValeurTBx = Empty
Else: ValeurTBx = TBx.Text: End If
End Function
 

gbstyle

XLDnaute Occasionnel
c'est un peu plus compliqué que ça :/ ...
exemple typique de code qui me serait d'une grande utilité mais difficile à adapter au projet étant donnée que toute les infos n'y sont pas renseigné :/ d'où mon besoin :/
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Si c'est pour un suivi de stock je rajouterais simplement une colonne Stock actuel et un certain nombre de paires de colonnes avec Date/Heure et Quantité apportée ou retirée, et je me servirais d'un seul UserForm pour tout faire.
 

gbstyle

XLDnaute Occasionnel
c'est ce que j'essaye de faire mais trop compliqué j'essaie de travailler sur une base simple recensant 4 page
Base création fournisseur
Base création article
Base mouvement entrée sortie/ gestion mutli emplacement définis
Base etat des stocks
Je doute que toute ces infos avec un minimum de précision rentre que sur un seul userform d'où mon idée de créer des multipages.
si je pouvais t'envoyer mon fichier tu comprendrais très rapidement vu ta maitrise ma problématique
https://www.cjoint.com/c/HBtnwja0vwi
D'avance merci
 

gbstyle

XLDnaute Occasionnel
Si c'est pour un suivi de stock je rajouterais simplement une colonne Stock actuel et un certain nombre de paires de colonnes avec Date/Heure et Quantité apportée ou retirée, et je me servirais d'un seul UserForm pour tout faire.
je t'ai joint un lien cjoint pour que tu me donne ton point de vue sur l'architecture ca m'interesse fortement
Et encore merci si tu prend un petit peu de temp pour y jeter un oeil
 

Discussions similaires


Haut Bas