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 !
Dans un USF j'ai un TextBox dans lequel on rentre des nombres.
Quand ces nombres sont grands, je voudrais que ceux-ci apparaissent avec un point séparateur des milliers.
Par exemple : 100000000 --> 100.000.000 ... c'est plus clair !
Pour une cellule de la feuille on écrirait dans une macro événementielle : cel.NumberFormat = "#,##0.00"
En revanche, comment s'y prendre pour un TextBox d'un USF, si tant est que ce soit possible ?
Je suis confronté à un nouveau problème. Le code de job marche très bien avec des nombres entiers, mais pas décimaux.
1000000 --> 1.000.000
1000000,63 --> 10.000.063 au lieu de 1.000.000,63
Je reviens sur ce problème de détestable USF (pas pratiques ces machins !!!!).
Au départ, j'avais "bêtement écrit" :
VB:
PrivateSub TextBox1_Change()'où l'on rentre la limite inférieure
Lim_Inf = TextBox1
EndSub
Si je rentrais, par exemple, 10,5 dans le TextBox, s'affichait : 10.5 en insupportable anglo-saxon
J'essaie de corriger ce problème par :
VB:
PrivateSub TextBox1_Change()'où l'on rentre la limite inférieure
Lim_Inf = TextBox1
TextBox1 = Replace(TextBox1,".",",")EndSub
Ça va mieux. Quand je rentre 10,5 s'affiche bien 10,5.
Maintenant je veux rentrer, par exemple, 1000000,5 et faire en sorte que s'affiche 1.000.000,5.
Je rajoute la sentence de job pour voir... :
VB:
PrivateSub TextBox1_Change()'où l'on rentre la limite inférieure
Lim_Inf = TextBox1
TextBox1 = Replace(TextBox1,".",",")
TextBox1 = Replace(Format(TextBox1,"#,##000"), Chr(160),".")EndSub
---> panique à bord.
Ce que je veux obtenir (simple après tout) est-il possible ?
Magic_Doctor, le mieux serait peut-être sur la sortie du Textbox, je pense.
On rentre ses chiffres, on appuie sur "Tabulation", qui nous fait quitter la Textbox, et hop, la magie s'opère juste avant de valider par "enter".
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Lim_Inf = TextBox1
TextBox1 = Replace(TextBox1, ".", ",")
TextBox1 = Replace(Format(TextBox1, "#,##0.00"), Chr(160), ".")
End Sub
Private Sub CommandButton1_Click()
Lim_Inf = Val(Replace(TextBox1, ",", "."))
TextBox1 = Replace(Format(Lim_Inf, "#,##0.00"), Chr(160), ".")
End Sub
ou bien :
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Lim_Inf = Val(Replace(TextBox1, ",", "."))
TextBox1 = Replace(Format(Lim_Inf, "#,##0.00"), Chr(160), ".")
End Sub
fonctionnent quel que soit le séparateur décimal utilisé dans TextBox1 ou sur l'ordi.
Un peu déconcertant ce truc-là. Pourtant ce devrait être aussi simple que pour une cellule...
Si j'écris :
VB:
PrivateSub TextBox1_Change()OnErrorResumeNext'évite pb si on vide le TextBox
Lim_Sup = TextBox1
TextBox1 = Replace(Format(TextBox1,"#,##0"), Chr(160),".")EndSub
Ça marche très bien (le nombre dans le TextBox se formate au fur et à mesure de son introduction, ce qui est l'idéal), mais tant que l'on n'introduit pas de virgule. En somme, le nombre doit rester entier.
Si j'écris :
VB:
PrivateSub TextBox1_Change()OnErrorResumeNext'évite pb si on vide le TextBox
Lim_Sup = TextBox1
TextBox1 = Replace(TextBox1,".",",")EndSub
Ça marche très bien pour les chiffres décimaux.
En revanche, impossible de satisfaire les 2 conditions (mise en forme avec pointeur des milliers + possibilité de chiffres décimaux avec une virgule et non pas un point comme chez ceux qui font toujours tout à l'envers...) en écrivant :
VB:
PrivateSub TextBox1_Change()OnErrorResumeNext'évite pb si on vide le TextBox
Lim_Sup = TextBox1
TextBox1 = Replace(TextBox1,".",",")
TextBox1 = Replace(Format(TextBox1,"#,##0"), Chr(160),".")EndSub
Résultat bizarre...
Il est vrai que me suis laissé attraper par "TextBox1_Change" qui est l'option par défaut quand on attribue une macro à un TextBox. Je ne maîtrise pas toutes les subtilités entre "Change", "Exit", "Enter"...
Je rectifie en écrivant la proposition de sourcier08 :
VB:
PrivateSub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)'sourcier08OnErrorResumeNext'évite pb si on vide le TextBox
Lim_Inf = TextBox1
TextBox1 = Replace(TextBox1,".",",")
TextBox1 = Replace(Format(TextBox1,"#,##0.00"), Chr(160),".")EndSub
Ça marche, c'est, disons, moins instantané qu'avec "Change", mais les 2 conditions sont satisfaites seulement après avoir validé (ENTER) le TextBox.
J'essaie, enfin, la solution de job :
VB:
PrivateSub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)'job75OnErrorResumeNext'évite pb si on vide le TextBox
Lim_Inf = Val(Replace(TextBox1,",","."))
TextBox1 = Replace(Format(Lim_Inf,"#,##0.00"), Chr(160),".")EndSub
Ça marche avec le pointeur de milliers, mais pas avec les décimaux qui sont tronqués en entiers.
J'en déduis que les USF devraient être sérieusement améliorés par l'armada de programmeurs chez Microsoft...
Mais le mieux est un bon exemple, ci-joint le fameux USF.
En tout cas merci pour tous vos conseils.
PS : attention, pour que l'USF fonctionne correctement :
- sur Excel 2010 il faut avoir coché l'option*Accès approuvé au modèle d'objet du projet VBA*(onglet Fichier-Options-Centre de gestion de la confidentialité-Paramètres...-Paramètres des macros)
- sur Excel 2003 il faut avoir coché l'option*Faire confiance au projet Visual Basic*(menu Outils-Macro-Sécurité-Editeurs approuvés).
C'est tordu mais c'est comme ça.
Les valeurs entrées dans l'USF (TextBoxs & ComboBox) sont gardées en mémoire, de telle sorte qu'il n'y a pas à les réintroduire à chaque ouverture de l'USF (merci job !). Un impératif qui, curieusement, ne passionne pas grand monde...
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'job75
On Error Resume Next 'évite pb si on vide le TextBox
Lim_Inf = Val(Replace(TextBox1, ",", "."))
TextBox1 = Replace(Format(Lim_Inf, "#,##0.00"), Chr(160), ".")
End Sub
Ça marche avec le pointeur de milliers, mais pas avec les décimaux qui sont tronqués en entiers.
Ne raconte pas n'importe quoi... Et ton On Error Resume Next ne sert strictement à rien.
Edit : si tu veux afficher toutes les décimales entrées :
Code:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim t$, dec%
t = Replace(TextBox1, ",", ".")
dec = Len(t) - InStr(t, ".")
Lim_Inf = Val(t)
TextBox1 = Replace(Format(Lim_Inf, "#,##0." & String(dec, "0")), Chr(160), ".")
End Sub
Il me semble qu'on a déjà vu un truc comme ça sur un autre fil.
Tu as raison pour l'inutilité de "On Error Resume Next" pour ta routine (je viens de vérifier). En revanche, pour celle de sourcier08, si on vide le TextBox --> Pb.
Maintenant je rentre dans le TextBox2 (celui de ta routine) 2833,63 --> 2834,00 | 2833,12 --> 2833,00
Les décimales ne s'affichent pas et le chiffre est arrondi.
Enfin, chez moi ça se passe comme ça.
Peut-être que le problème vient de ma version d'Excel.
- 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