Bonjour, Salut à tous !
D'abord il apparaît que les TextBox 1 et 4 ne sont pas concernés par la saisie : il convient donc de les verrouiller pour empêcher toute saisie (propriété Locked à True, et simultanément propriété TabStop à False, qui les éliminera en tant que points d'arrêt lors de la tabulation). L'utilisateur ne pourra pas saisir.
Ensuite, un minimum de mise en forme consiste à afficher tes montants avec virgule (à moins que ton séparateur décimal soit autre ?), et deux chiffres après la virgule. Il faut donc mettre en forme le montant initialisé dans TextBox1 et transformer le point en virgule à la saisie dans TextBox2 et 3.
Enfin, remplacer l'évènement Change (qui se produit à chaque caractère saisi) par AfterUpdate (qui intervient lors de la validation de la saisie). Transférer la mise à jour lors de saisie à une proc. commune, qui formatera la saisie dans la TextBox appelante et procèdera au calcul à affecter la la TextBox4.
Ce qui donne (code) :
Sub Maj(n As Integer)
Dim i%, Tot
With Controls("TextBox" & n)
.Value = Format(Val(Replace(.Value, ",", ".")), "0.00")
End With
Tot = Val(Replace(TextBox1.Value, ",", "."))
For i = 2 To 3
Tot = Tot - Val(Replace(Controls("TextBox" & i).Value, ",", "."))
Next i
TextBox4.Value = Format(Tot, "0.00")
End Sub
Private Sub TextBox2_AfterUpdate()
Maj 2
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 46 Then KeyAscii = 44
End Sub
Private Sub TextBox3_AfterUpdate()
Maj 3
End Sub
Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 46 Then KeyAscii = 44
End Sub
Private Sub UserForm_Initialize()
Me.TextBox1.Value = Format(Worksheets("Folha1").Range("A65536").End(xlUp), "0.00")
End Sub
Cordialement.