Microsoft 365 Vba affichage Numérique TextBox

974RE

XLDnaute Occasionnel
Soan, Le Forum,
Je rencontre un problème d'affichage sur des TextBox de l'USF Modifier: après avoir saisie un nombre, les textBox (2 à 13 donc Janvier à Décembre) n'affichent pas les décimales si elles sont à 0 ( saisie: 20,10 affichage textBox = 20,1). Apparemment, il y aurait un problème sur les codes concernant ces TexBox: impossible de forcer le format.
J'ai également un "beug" qui intervient après la validation du montant saisie: si les cellules du tableau (Janvier à Décembre) sont vides: "Incompatibilité de Type" sur les lignes "Range("E" & Ligne).Value = CDbl(TextBox3.Value). Il est nécessaire que les cellules soient vides, car cela me permet de voir que j'ai loupé la saisie d'une ligne. Si la consommation est à 0, cela signifie qu'il n'y a pas de loupé: la consommation est à 0,00.
Ci-joint le fichier.
Avec tous mes remerciements.
 

Pièces jointes

  • Essai Contrôle Facturation Mai 2021.xlsm
    159.4 KB · Affichages: 48

974RE

XLDnaute Occasionnel
Bonjour 974RE,

ton fichier en retour. 🙂 je te laisse faire tous les tests nécessaires. 😜

pour le code VBA : attention : j'ai modifié la sub TxtB_Change(), mais j'ai aussi modifié beaucoup d'autres choses ! donc je te recommande de relire entièrement tout le code VBA ci-dessous ! 🤓 comme ton dossier marché est bouclé, ça tombe très bien : tu auras tout l'temps pour potasser tout ça à la plage, dans un hamac, les doigts de pieds en éventail, avec un cocktail exotique en guise d'apéro ; j'espère que tu auras beaucoup de mal à comprendre mon code VBA, car ça te donnera un excellent prétexte pour inviter la fille des cocotiers à venir te faire la lecture ! 😄 😂 🤣 éventuellement, si tu as tout compris parfaitement tout seul, de toi-même, tu peux toujours faire semblant de n'avoir rien compris du tout ! 🤪 (si c'est pour que tu puisses revoir la fille de tes rêves, c'est une occasion à ne pas manquer ! 💘)



module du UserForm "Modifier" (126 lignes) :

VB:
Option Explicit

Public WithEvents TxtB As MSForms.TextBox

Dim Ws As Worksheet
Dim SelectedIndex As Integer
Dim cls(1 To 15) As New Modifier

Const fmt1 = "#,##0.00;-#,##0.00"
Const fmt2 = "#,##0.00 €;-#,##0.00 €"

Private Sub Quitter_Click()
  Unload Me 'Ferme le Formulaire
  Accueil.Show 0
End Sub

Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub

Private Sub TxtB_Change()
  Dim chn$, mem#, i As Byte
  If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
  For i = 2 To 13
    With Modifier.Frame1.Controls("TextBox" & i)
      chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)
    End With
    Frame1.Controls("TextBox" & i) = Format(chn, fmt1)
  Next i
  Modifier.Frame1.TextBox14 = mem
End Sub


Private Sub UserForm_Activate()
  Dim ctrl, MaSomme#, MC%, J&, MPL&, MDL&, a&
  ComboBox2.ColumnCount = 1 'Pour la liste Civilité
  ComboBox2.List() = Array("Civilité", "Mr", "Mme")
  Set Ws = Sheets("Controle") 'Correspond au nom de l'onglet dans le fichier Excel
  With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
      .AddItem Ws.Range("C" & J) & " - " & Format(Ws.Range("A" & J), "0# ## ## ## ##")
    Next J
  End With
  For Each ctrl In Frame1.Controls
    If TypeName(ctrl) = "TextBox" And ctrl.Name <> "TextBox14" Then
      a = a + 1: Set cls(a).TxtB = ctrl
    End If
  Next ctrl
  Worksheets("Controle").Select
  MC = 16 'Ma Collone
  MPL = 2 'Ma Première Ligne
  MDL = Cells(Rows.Count, "P").End(xlUp).Row - 1 'Ma Dernière Ligne
  MaSomme = 0
  For J = MPL To MDL
    MaSomme = MaSomme + Cells(J, MC)
  Next J
  TextBox15 = MaSomme
End Sub


Private Sub ComboBox1_Change()
  Dim Ligne&, i As Byte
  SelectedIndex = ComboBox1.ListIndex
  If ComboBox1.ListIndex = -1 Then
    ComboBox2.ListIndex = -1
    For i = 1 To 14
      Controls("TextBox" & i) = ""
    Next i
  Else
    Ligne = ComboBox1.ListIndex + 2
    ComboBox2 = Ws.Cells(Ligne, "B")
    Textbox1 = Ws.Cells(Ligne, "C")
    For i = 2 To 14
      Controls("TextBox" & i) = Format(Ws.Cells(Ligne, i + 2), fmt1)
    Next i
  End If
  If ComboBox1.ListIndex <> -1 Then Cells(ComboBox1.ListIndex + 2, 1).Select
End Sub


Private Sub Valider_Click()
  'Correspond au programme du bouton Modifier
  Dim MaSomme#, MC%, Ligne&, MPL&, MDL&
 
  If MsgBox("Etes-vous certain de vouloir mofifier la fiche?", vbYesNo, "Demande de confirmation") = vbYes Then
    If SelectedIndex = -1 Then Exit Sub
    Ligne = SelectedIndex + 2
    Ws.Cells(Ligne, "B") = ComboBox2
    Ws.Cells(Ligne, 3) = Textbox1
    Ws.Columns("D:O").NumberFormat = fmt1
    Ws.Columns("P").NumberFormat = fmt2
    On Error Resume Next
    Ws.Range("D" & Ligne) = Trim$(TextBox2) * 1
    Ws.Range("E" & Ligne) = Trim$(TextBox3) * 1
    Ws.Range("F" & Ligne) = Trim$(TextBox4) * 1
    Ws.Range("G" & Ligne) = Trim$(TextBox5) * 1
    Ws.Range("H" & Ligne) = Trim$(TextBox6) * 1
    Ws.Range("I" & Ligne) = Trim$(TextBox7) * 1
    Ws.Range("J" & Ligne) = Trim$(TextBox8) * 1
    Ws.Range("K" & Ligne) = Trim$(TextBox9) * 1
    Ws.Range("L" & Ligne) = Trim$(TextBox10) * 1
    Ws.Range("M" & Ligne) = Trim$(TextBox11) * 1
    Ws.Range("N" & Ligne) = Trim$(TextBox12) * 1
    Ws.Range("O" & Ligne) = Trim$(TextBox13) * 1
    Ws.Range("P" & Ligne).Formula = "=SUM(D" & Ligne & ":O" & Ligne & ")"
    Err.Clear
  End If
 
  MC = 16 'Ma Colonne
  MPL = 2 'Ma Première Ligne
  MDL = Cells(Rows.Count, "P").End(xlUp).Row - 1 'Ma Dernière Ligne
 
  For Ligne = MPL To MDL
    MaSomme = MaSomme + Cells(Ligne, MC)
  Next Ligne
  TextBox15 = MaSomme
   
  Worksheets("Top 10 Conso").Select: Tri
  Worksheets("Controle").Select
 
End Sub

j'ai aussi fait de petites modifs dans Module1 :

VB:
Option Explicit

Sub Tri()
  Dim plage As Range
  Worksheets("Top10Conso").Select: Application.ScreenUpdating = 0
  Set plage = Range("B2:P" & Range("P" & Rows.Count).End(xlUp).Row - 1)
  plage.Sort key1:=[P2], Order1:=xlDescending, Header:=xlGuess, _
    OrderCustom:=1, Orientation:=xlTopToBottom
End Sub

à te lire pour avoir ton avis. ;)

soan
Bonsoir Soan,
Merci de m'avoir une fois encore apporter ton aide.
Mon dossier marché est effectivement bouclé, en tout cas la première phase: élaboration du cahier des charges et publication: c'est nous qui lançons un marché Télécom.
Je suis dans l'attente des retours des différents opérateurs pour ensuite l'analyse des offres: gros travail encore, puis attribution des différents lots et enfin, la phase opérationnelle qui est la mise en œuvre du marché. Donc comme tu vois encore du boulot dans les mois à venir.
Donc la plage en ce moment, faut pas trop compter dessus. De toute façon on entre en hiver ici. Et chez nous si la température de l'eau est inférieure ou égal à 25 degré , personne ne va à la plage . Fait trop froid (29 à 30 degré c'est bon). Sauf quelques "Zoreils" (Zoreils = Métropolitains: ceux qui ont sauté la mer pour atterrir chez nous).
Je regarde tes codes, et je reviens vers toi pour avoir les explications.
Merci d'avoir balayé tous les codes, cela a dû amener de la cohérence, ce qui évitera les problèmes à venir.
Bonne soirée à toi.
 

974RE

XLDnaute Occasionnel
Bonjour
juste un petit exemple du comment j'envoi 12 textbox nombre décimal (point ou virgule dans la meme session)ou pas en un seul coup dans la ligne
VB:
Private Sub CommandButton1_Click()
    arr = Array(TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9, TextBox10, TextBox11, TextBox12, TextBox13)
    For i = LBound(arr) To UBound(arr): arr(i) = Val(Replace(arr(i), ",", ".")): Next
    ligne = 1
    With Range("D" & ligne).Resize(, UBound(arr) + 1): .Value = arr: .NumberFormat = "#0.00": End With
End Sub
Bonsoir Patrick,
Content de te retrouver sur mon fil.
Merci pour ta contribution. Cela apporte une plus value indéniable.
Lorsque je mettrais le fichier à disposition sur le Forum, chacun trouvera les réponses potentielles aux problèmes soulevés. Chacun pourra y trouver son bonheur.
Merci à toi, bonne soirée.
 

974RE

XLDnaute Occasionnel
Bonsoir Soan,
Merci de m'avoir une fois encore apporter ton aide.
Mon dossier marché est effectivement bouclé, en tout cas la première phase: élaboration du cahier des charges et publication: c'est nous qui lançons un marché Télécom.
Je suis dans l'attente des retours des différents opérateurs pour ensuite l'analyse des offres: gros travail encore, puis attribution des différents lots et enfin, la phase opérationnelle qui est la mise en œuvre du marché. Donc comme tu vois encore du boulot dans les mois à venir.
Donc la plage en ce moment, faut pas trop compter dessus. De toute façon on entre en hiver ici. Et chez nous si la température de l'eau est inférieure ou égal à 25 degré , personne ne va à la plage . Fait trop froid (29 à 30 degré c'est bon). Sauf quelques "Zoreils" (Zoreils = Métropolitains: ceux qui ont sauté la mer pour atterrir chez nous).
Je regarde tes codes, et je reviens vers toi pour avoir les explications.
Merci d'avoir balayé tous les codes, cela a dû amener de la cohérence, ce qui évitera les problèmes à venir.
Bonne soirée à toi.
Bonsoir Soan,
Comme convenu je reviens vers toi après avoir "éplucher" tes codes.
J'ai donc tenté de comprendre ce que tu avais codé.
Je vais donc te faire part de ce que j'ai cru comprendre:
VB:
Option Explicit

Public WithEvents TxtB As MSForms.TextBox

Dim Ws As Worksheet
Dim SelectedIndex As Integer
Dim cls(1 To 15) As New Modifier

Const fmt1 = "#,##0.00;-#,##0.00"
Const fmt2 = "#,##0.00 €;-#,##0.00 €"
[COLOR=rgb(97, 189, 109)]'Ici tu définis le format des TextBox de Janvier à Décembre et les format des TextBox 14 et 15. Cela dans toutes les procédures où ils sont susceptibles d'être appelés. Il n'y a plus nécessité de "coder" les formats à chaque fois: on utilise fmt1 ou fmt2. Ce sont des constantes ( Const): leurs valeurs sont fixes.
Cela grâce à la déclaration "Public "[/COLOR]

Private Sub Quitter_Click()
  Unload Me 'Ferme le Formulaire
  Accueil.Show 0
End Sub

Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub
[COLOR=rgb(97, 189, 109)]'Ici tu affecte le format de la TextBox14 en utilisant fmt2 défini plus haut. Idem pour la TextBox15'[/COLOR]

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub

Private Sub TxtB_Change()
  Dim chn$, mem#, i As Byte
  'Ici tu as utilisé des raccourcispour définir la valeur des variables: $=Sting, #=Double, Byte =nombre entre 0 et 255'
  If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
 [COLOR=rgb(97, 189, 109)] 'Ici tu permets l'utilisation du point du clavier numérique ou la virgule pour les décimales[/COLOR]
  For i = 2 To 13
  [COLOR=rgb(97, 189, 109)]'Ici tu fais une boucle sur les 13 TextBox de la Frame1 et tu leurs affectent une valeur numérique et tu affecte à "mem" le format fmt1[/COLOR]
    With Modifier.Frame1.Controls("TextBox" & i)
      chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)
    End With
    Frame1.Controls("TextBox" & i) = Format(chn, fmt1)
  Next i
  Modifier.Frame1.TextBox14 = mem
 [COLOR=rgb(97, 189, 109)]'Ici tu "active" la modification de la TextBox14 après addition des[/COLOR] [COLOR=rgb(97, 189, 109)]TextBox'[/COLOR]
End Sub


Private Sub UserForm_Activate()
  Dim ctrl, MaSomme#, MC%, J&, MPL&, MDL&, a&
  ComboBox2.ColumnCount = 1 'Pour la liste Civilité
  ComboBox2.List() = Array("Civilité", "Mr", "Mme")
  Set Ws = Sheets("Controle")[COLOR=rgb(97, 189, 109)] 'Correspond au nom de l'onglet dans le fichier Excel[/COLOR]
  With Me.ComboBox1
    For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
      .AddItem Ws.Range("C" & J) & " - " & Format(Ws.Range("A" & J), "0# ## ## ## ##")
    Next J [COLOR=rgb(97, 189, 109)]'Ici tu fais une boucle sur le tableau et tu associes le nom et le numéro de téléphone pour l'afficher dans la ComboBox1: Rechercher. La fin du code correspond au format du numéro de téléphone. '[/COLOR]
  End With
  For Each ctrl In Frame1.Controls [COLOR=rgb(97, 189, 109)]'Ici à l'aide de "For Each" tu accède à la Frame1. "ctrl"???[/COLOR]
    If TypeName(ctrl) = "TextBox" And ctrl.Name <> "TextBox14" Then
      a = a + 1: Set cls(a).TxtB = ctrl [COLOR=rgb(97, 189, 109)]' Je suppose qu'ici tu additionne les montants des TextBox de la Frame1???[/COLOR]
    End If
  Next ctrl
  Worksheets("Controle").Select
  MC = 16 'Ma Collone
  MPL = 2 'Ma Première Ligne
  MDL = Cells(Rows.Count, "P").End(xlUp).Row - 1 'Ma Dernière Ligne
  MaSomme = 0
  For J = MPL To MDL
    MaSomme = MaSomme + Cells(J, MC)
  Next J
  TextBox15 = MaSomme [COLOR=rgb(97, 189, 109)]'Ici tu additionne les montants de la colonne "O" et le total s'affiche dans la TextBox15 dont le format est fmt2'[/COLOR]
End Sub


Private Sub ComboBox1_Change()
  Dim Ligne&, i As Byte
  SelectedIndex = ComboBox1.ListIndex
  If ComboBox1.ListIndex = -1 Then
    ComboBox2.ListIndex = -1
    For i = 1 To 14
      Controls("TextBox" & i) = "" [COLOR=rgb(97, 189, 109)]' Ici tu affiche l'UsF à vide lors de l'ouverture[/COLOR]
    Next i
  Else
    Ligne = ComboBox1.ListIndex + 2
    ComboBox2 = Ws.Cells(Ligne, "B")
    Textbox1 = Ws.Cells(Ligne, "C")
    For i = 2 To 14
      Controls("TextBox" & i) = Format(Ws.Cells(Ligne, i + 2), fmt1)
      [COLOR=rgb(97, 189, 109)]'Ici tu définis le contenu des TextBox en fonction du choix effectué, ainsi que leurs formats'[/COLOR]
    Next i
  End If
  If ComboBox1.ListIndex <> -1 Then Cells(ComboBox1.ListIndex + 2, 1).Select
  [COLOR=rgb(97, 189, 109)]'Ici tu positionne le curseur dans le tableau sur la cellule contenant le nom choisi dans la ComboBox1[/COLOR]
End Sub


Private Sub Valider_Click()
 [COLOR=rgb(97, 189, 109)] 'Correspond au programme du bouton Valider Modification ou Ajout[/COLOR]
  Dim MaSomme#, MC%, Ligne&, MPL&, MDL&
 
  If MsgBox("Etes-vous certain de vouloir mofifier la fiche?", vbYesNo, "Demande de confirmation") = vbYes Then
    If SelectedIndex = -1 Then Exit Sub
    Ligne = SelectedIndex + 2 [COLOR=rgb(97, 189, 109)]'ici tu définis la première ligne à renseigner[/COLOR]
    Ws.Cells(Ligne, "B") = ComboBox2
    Ws.Cells(Ligne, 3) = Textbox1[COLOR=rgb(97, 189, 109)] 'Ici tu indique où se trouve la valeur de la TextBox1: Nom[/COLOR]
    Ws.Columns("D:O").NumberFormat = fmt1 [COLOR=rgb(97, 189, 109)]'Ici tu définis le format des cellules de la plage "C:N"[/COLOR]
    Ws.Columns("P").NumberFormat = fmt2 [COLOR=rgb(97, 189, 109)]'Ici tu définis le format de la colonne "Total"[/COLOR]
    On Error Resume Next [COLOR=rgb(97, 189, 109)]'Ici tu indique de continuer à traiter les instructions même s'il y a une erreur, je ne comprends pas très bien le concept????[/COLOR]
    Ws.Range("D" & Ligne) = Trim$(TextBox2) * 1 [COLOR=rgb(97, 189, 109)]'Ici tu indique où va aller les valeurs entrées en supprimant les éventuels espaces vides avant et après la valeur entrée. Par contre je n'ai pas compris [/COLOR][COLOR=rgb(184, 49, 47)]*1[/COLOR][COLOR=rgb(97, 189, 109)]???[/COLOR]
    Ws.Range("E" & Ligne) = Trim$(TextBox3) * 1
    Ws.Range("F" & Ligne) = Trim$(TextBox4) * 1
    Ws.Range("G" & Ligne) = Trim$(TextBox5) * 1
    Ws.Range("H" & Ligne) = Trim$(TextBox6) * 1
    Ws.Range("I" & Ligne) = Trim$(TextBox7) * 1
    Ws.Range("J" & Ligne) = Trim$(TextBox8) * 1
    Ws.Range("K" & Ligne) = Trim$(TextBox9) * 1
    Ws.Range("L" & Ligne) = Trim$(TextBox10) * 1
    Ws.Range("M" & Ligne) = Trim$(TextBox11) * 1
    Ws.Range("N" & Ligne) = Trim$(TextBox12) * 1
    Ws.Range("O" & Ligne) = Trim$(TextBox13) * 1
    Ws.Range("P" & Ligne).Formula = "=SUM(D" & Ligne & ":O" & Ligne & ")"
    Err.Clear [COLOR=rgb(97, 189, 109)]'Efface les erreurs????[/COLOR]
  End If
 
  MC = 16 'Ma Colonne
  MPL = 2 'Ma Première Ligne
  MDL = Cells(Rows.Count, "P").End(xlUp).Row - 1 'Ma Dernière Ligne
 
  For Ligne = MPL To MDL
    MaSomme = MaSomme + Cells(Ligne, MC)
  Next Ligne
  TextBox15 = MaSomme
    
  Worksheets("Top 10 Conso").Select: Tri [COLOR=rgb(97, 189, 109)]'Ici tu effectues le classement sur la feuille "Top10Conso" après la validation de la modification, ou de l'Ajout.
 Dans le module "Tri", tu as rajouté "Application.ScreenUpdating=0" qui permet de faire le tri sans que l'on ne voit l'exécution de la Macro. Cela accélère en même temps l'exécution de la Macro.[/COLOR]
  Worksheets("Controle").Select [COLOR=rgb(97, 189, 109)]'Ici on revient sur la feuille "Controle".[/COLOR]
 En Sub

Je reste dans l'attente de ton verdict et des précisions que tu voudras bien m'apporter.
Soan merci encore milles fois pour ton aide. J'ai pleinement conscience du boulot que cela t'a demandé, et j'apprécie le travail a sa hauteur.
Dans l'attente, bonne soirée à toi.
 

patricktoulon

XLDnaute Barbatruc
Bonjour

ça m' étonnerait que tu n'ai pas un problème avec ceci lors de l’addition
la raison est simple le format ##0,000.00 ne sera jamais reconnu comme numeric par VBA
alors ton test isnumeric ne fonctionnera pas ou tout le calcul sera faussé si nombre de plus de 999.99
et non seulement ça mais comme c'est le change et que le textbox declanche le calcul
quand tu va taper le séparateur ben pouff!!!! ca va planter car par exemple 12. ou 12, n'est pas numérique
Code:
Private Sub TxtB_Change()
  Dim chn$, mem#, i As Byte
  'Ici tu as utilisé des raccourcispour définir la valeur des variables: $=Sting, #=Double, Byte =nombre entre 0 et 255'
  If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
 [COLOR=rgb(97, 189, 109)] 'Ici tu permets l'utilisation du point du clavier numérique ou la virgule pour les décimales[/COLOR]
  For i = 2 To 13
  [COLOR=rgb(97, 189, 109)]'Ici tu fais une boucle sur les 13 TextBox de la Frame1 et tu leurs affectent une valeur numérique et tu affecte à "mem" le format fmt1[/COLOR]
    With Modifier.Frame1.Controls("TextBox" & i)
      chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)
    End With
    Frame1.Controls("TextBox" & i) = Format(chn, fmt1)
  Next i
  Modifier.Frame1.TextBox14 = mem
 [COLOR=rgb(97, 189, 109)]'Ici tu "active" la modification de la TextBox14 après addition des[/COLOR] [COLOR=rgb(97, 189, 109)]TextBox'[/COLOR]
End Sub

il faut savoir que pour VBA le séparateur décimal est le point et cela pour toute version excel

ensuite par exemple ceci
j’espère que tu n'a pas a taper les chiffres au clavier car la encore tu va avoir un problème
VB:
Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub
[COLOR=rgb(97, 189, 109)]'Ici tu affecte le format de la TextBox14 en utilisant fmt2 défini plus haut. Idem pour la TextBox15'[/COLOR]

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub

en j'en passe et des meilleures car il y a tellement de méprise dans ce concept que je ne saurais les
énumérer

démonstration du problème avec le change du textbox 14 et 15
allez je fait un petit usf pour les tests
VB:
Const fmt1 = "#,##0.00;-#,##0.00"
Const fmt2 = "#,##0.00 €;-#,##0.00 €"
Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub
 'Ici tu affecte le format de la TextBox14 en utilisant fmt2 défini plus haut. Idem pour la TextBox15'[/COLOR]

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub
pour les tests je vais me contenter de taper 1 puis 2 puis 3 donc 123
voyons voir
demo7.gif


ah ben oui!! c'est ballo!!! hein
alors imagine pour tes 13 autres quand tu fait le cumul avec cette ligne

Code:
chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)

a ouais on rigole bien ici ;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je te donne donc une astuce
force le point comme séparateur décimal pour tes textboxs
et pour le calcul utilise val
pourquoi
et bien parce que val en vba te donnera toujours la valeur
exemple
msgbox val("52.")
msgbox val("52.1")
msgbox val("52.25")

et oublie le formatage fmt1 et fmt2 ou alors fait un post traitement avant calcul
beaucoup de grands tralala pour pas grand chose selon moi
 

Piment

XLDnaute Occasionnel
Bonjour

ça m' étonnerait que tu n'ai pas un problème avec ceci lors de l’addition
la raison est simple le format ##0,000.00 ne sera jamais reconnu comme numeric par VBA
alors ton test isnumeric ne fonctionnera pas ou tout le calcul sera faussé si nombre de plus de 999.99
et non seulement ça mais comme c'est le change et que le textbox declanche le calcul
quand tu va taper le séparateur ben pouff!!!! ca va planter car par exemple 12. ou 12, n'est pas numérique
Code:
Private Sub TxtB_Change()
  Dim chn$, mem#, i As Byte
  'Ici tu as utilisé des raccourcispour définir la valeur des variables: $=Sting, #=Double, Byte =nombre entre 0 et 255'
  If Right$(TxtB, 1) = "." Then TxtB = Replace$(TxtB, ".", ",")
 [COLOR=rgb(97, 189, 109)] 'Ici tu permets l'utilisation du point du clavier numérique ou la virgule pour les décimales[/COLOR]
  For i = 2 To 13
  [COLOR=rgb(97, 189, 109)]'Ici tu fais une boucle sur les 13 TextBox de la Frame1 et tu leurs affectent une valeur numérique et tu affecte à "mem" le format fmt1[/COLOR]
    With Modifier.Frame1.Controls("TextBox" & i)
      chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)
    End With
    Frame1.Controls("TextBox" & i) = Format(chn, fmt1)
  Next i
  Modifier.Frame1.TextBox14 = mem
 [COLOR=rgb(97, 189, 109)]'Ici tu "active" la modification de la TextBox14 après addition des[/COLOR] [COLOR=rgb(97, 189, 109)]TextBox'[/COLOR]
End Sub

il faut savoir que pour VBA le séparateur décimal est le point et cela pour toute version excel

ensuite par exemple ceci
j’espère que tu n'a pas a taper les chiffres au clavier car la encore tu va avoir un problème
VB:
Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub
[COLOR=rgb(97, 189, 109)]'Ici tu affecte le format de la TextBox14 en utilisant fmt2 défini plus haut. Idem pour la TextBox15'[/COLOR]

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub

en j'en passe et des meilleures car il y a tellement de méprise dans ce concept que je ne saurais les
énumérer

démonstration du problème avec le change du textbox 14 et 15
allez je fait un petit usf pour les tests
VB:
Const fmt1 = "#,##0.00;-#,##0.00"
Const fmt2 = "#,##0.00 €;-#,##0.00 €"
Private Sub TextBox14_change()
  TextBox14 = Format(TextBox14, fmt2)
End Sub
 'Ici tu affecte le format de la TextBox14 en utilisant fmt2 défini plus haut. Idem pour la TextBox15'[/COLOR]

Private Sub TextBox15_Change()
  TextBox15 = Format(TextBox15, fmt2)
End Sub
pour les tests je vais me contenter de taper 1 puis 2 puis 3 donc 123
voyons voir
Regarde la pièce jointe 1107836

ah ben oui!! c'est ballo!!! hein
alors imagine pour tes 13 autres quand tu fait le cumul avec cette ligne

Code:
chn = .Value: If IsNumeric(chn) Then mem = mem + CDbl(chn)

a ouais on rigole bien ici ;)
Bonjour Patrick,
Content de te lire.
J'avoue ne pas comprendre ton post. La Textbox14 est la somme des montant entrées dans les TexBox2 à 13.
La TextBox15 est le total Annuel consommé par les Agents.
Je comprends d'autant moins que j'ai testé et ça fonctionne correctement. Je n'ai eu aucun beug.
 

patricktoulon

XLDnaute Barbatruc
re
oui c'est bien ce que je dis c'est une injection des nombres non formaté et le format est appliqué au résultat dans les deux txtb 14 et 15
n'essaie pas de taper dans ces deux textboxs ;)
d'ailleurs par sécurité tu devrait bloquer la possibilité de taper dedans
 

patricktoulon

XLDnaute Barbatruc
re
bon pour commencer je nettoie l'event activate de l'usf
VB:
Private Sub UserForm_Activate()
    Dim ctrl, a&, cel As Range
    Set Ws = Sheets("Controle")    'Correspond au nom de l'onglet dans le fichier Excel

    For Each cel In Range("tableau1[Nom Prénom]")
        ComboBox1.AddItem cel.Text & " - " & cel.Offset(, -1).Text
    Next
    ' classe textbox
    For Each ctrl In Me.Frame1.Controls
        If TypeOf ctrl Is MSForms.TextBox And Not " TextBox14TextBox15 " Like ctrl.Name Then
            a = a + 1: Set cls(a).TxtB = ctrl
        End If
    Next
    TextBox15 = WorksheetFunction.Sum(Range("Tableau1[Total]"))
End Sub
;)
 

Piment

XLDnaute Occasionnel
Je te remercie d'apporter ta contribution à ce projet.
Je ne t'ai pas envoyé le bon fichier, ci-joint le fichier de travail actuel.
Belle cure de amaigrissement de l'activate.
 

Pièces jointes

  • 2021 Contrôle Facturation Essai 1.xlsm
    99.5 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
re
non seulement je lui fait un régime mais aussi j'emploi les objects idoine
tu travaille sur des tableaux structurés et ça devrait te simplifie la tache
les end(xlup) et et cells... et tout et tout etc..... ne sont pas nécessaires

je dirais même mieux
pourquoi tu format les txtb avec fmt1 dans la classe event alors que tu le fait déjà dans le change de la combobox1



d'autant plus que l'on est dans l'userform modifier donc tu es sensé pouvoir les modifier au clavier et comme tel tu ne peux pas car des que tu tape une touche ça te formate le seul chiffre tapé
seul le replace ( point,virgule) est utile et le calcul mem#

bref y a pas mal de boulot là dessus ;)
 

patricktoulon

XLDnaute Barbatruc
ben c'est simple
ouvre ton userform modifier
choisi un item (les textboxs vont se remplir)
ensuite choisi un textbox vide et tape un nombre (tout du moins essaie )
surprise surprise tu peux pas des que tu va taper le premier chiffre ca va te le formater et tu ne peux plus taper ta suite car ca va l’écrire après
pour un interface de modification c'est moyen je dirais ;) 🤪 🤣
 

patricktoulon

XLDnaute Barbatruc
re
tu peux m'expliquer cela
pourquoi le textbox1 passe de (nom prénom) a (un nombre formaté )
Private Sub ComboBox1_Change()
Dim i As Byte
With ComboBox1
SelectedIndex = ComboBox1.ListIndex
If .ListIndex = -1 Then
For i = 1 To 13: Controls("TextBox" & i) = "": Next i
Else
Textbox1 = Ws.Cells(SelectedIndex , "B")
For i = 1 To 14
Controls("TextBox" & i) = Format(Ws.Cells(SelectedIndex , i + 1), fmt1)
Next i
Cells(.ListIndex + 2, 2).Select
End If
End With
End Sub
 

Discussions similaires

Réponses
7
Affichages
2 K