XL 2016 message d'erreur plutôt qu'erreur d'exécution

halecs93

XLDnaute Impliqué
Bonjour à toutes et à tous,

Il y a quelques temps de cela, grâce à la contribution de plusieurs membres du forum, j'avais réussi à finaliser un ficher pour passer des commandes. Ce fichier fonctionne presque parfaitement. En effet, lorsqu'un utilisateur saisi mal une somme (2?5 au lieu de 2,5 par exemple), le code VBA du fichier plante.

Y aurait-il moyen de prévenir l'utilisateur que sa saisie n'est pas bonne afin qu'il puisse recommencer mais, sans plantage ?

Je joins le fichier.

Un grand merci.

1688115858115.png
 

Pièces jointes

  • COMMANDE MATERIEL.xlsm
    43.9 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
Hello
il suffit de faire un controle de saisie

ajoutel'évènement _keydown du textbox
VB:
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 188 Then KeyCode = 110 'remplacement de la virgule par un point
If KeyCode = 110 Then 'saisie du point
    If InStr(1, Me.TextBox4, ".") <> 0 Then 'il y a déjà un point dans le nombre
        KeyCode = 0
    End If
End If
If Not (KeyCode >= 96 And KeyCode <= 106 Or KeyCode = 110) Then 'si on tape autre chose qu'un chiffre
    KeyCode = 0
End If
End Sub

et modifie l'évènement _change

Code:
Private Sub TextBox4_Change()
'Me.TextBox4 = Replace(Me.TextBox4, ".", Application.DecimalSeparator)
'Me.TextBox4 = Replace(Me.TextBox4, ",", Application.DecimalSeparator)
Me.TextBox5 = CLng(Me.TextBox3) * CDbl(Me.TextBox4)
End Sub
 

halecs93

XLDnaute Impliqué
Hello
il suffit de faire un controle de saisie

ajoutel'évènement _keydown du textbox
VB:
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 188 Then KeyCode = 110 'remplacement de la virgule par un point
If KeyCode = 110 Then 'saisie du point
    If InStr(1, Me.TextBox4, ".") <> 0 Then 'il y a déjà un point dans le nombre
        KeyCode = 0
    End If
End If
If Not (KeyCode >= 96 And KeyCode <= 106 Or KeyCode = 110) Then 'si on tape autre chose qu'un chiffre
    KeyCode = 0
End If
End Sub

et modifie l'évènement _change

Code:
Private Sub TextBox4_Change()
'Me.TextBox4 = Replace(Me.TextBox4, ".", Application.DecimalSeparator)
'Me.TextBox4 = Replace(Me.TextBox4, ",", Application.DecimalSeparator)
Me.TextBox5 = CLng(Me.TextBox3) * CDbl(Me.TextBox4)
End Sub
Bonjour et merci pour votre réactivité.

Cependant.... une question. Les deux premières lignes de l'évènement change sont précédées maintenant d'un apostrophe...ce qui les transforme en commentaire. Est-ce normal ?
 

halecs93

XLDnaute Impliqué
Hello
il suffit de faire un controle de saisie

ajoutel'évènement _keydown du textbox
VB:
Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 188 Then KeyCode = 110 'remplacement de la virgule par un point
If KeyCode = 110 Then 'saisie du point
    If InStr(1, Me.TextBox4, ".") <> 0 Then 'il y a déjà un point dans le nombre
        KeyCode = 0
    End If
End If
If Not (KeyCode >= 96 And KeyCode <= 106 Or KeyCode = 110) Then 'si on tape autre chose qu'un chiffre
    KeyCode = 0
End If
End Sub

et modifie l'évènement _change

Code:
Private Sub TextBox4_Change()
'Me.TextBox4 = Replace(Me.TextBox4, ".", Application.DecimalSeparator)
'Me.TextBox4 = Replace(Me.TextBox4, ",", Application.DecimalSeparator)
Me.TextBox5 = CLng(Me.TextBox3) * CDbl(Me.TextBox4)
End Sub
Du coup, je me perds un peu.... je ne vois pas où ajouter l'évènement "keydown"
 

vgendron

XLDnaute Barbatruc
par contre.. si tu effaces le textbox 4, alors, oui, il y a un bug

corrige avec ceci
VB:
Private Sub TextBox4_Change()
'Me.TextBox4 = Replace(Me.TextBox4, ".", Application.DecimalSeparator)
'Me.TextBox4 = Replace(Me.TextBox4, ",", Application.DecimalSeparator)
If Me.TextBox3 = "" Then Me.TextBox3 = 0
If Me.TextBox4 = "" Then Me.TextBox4 = 0


Me.TextBox5 = CLng(Me.TextBox3) * CDbl(Me.TextBox4)
End Sub
 

halecs93

XLDnaute Impliqué
Du coup, je crois avoir trouvé une solution....

Pour la textbox3 :

If Not IsNumeric(Me.TextBox3.Text) Or Not (CLng(Val(Me.TextBox3.Text)) = CDbl(Val(Me.TextBox3.Text))) Then
MsgBox "Veuillez saisir un chiffre entier pour la quantité.", vbExclamation, "Erreur de saisie"
Me.TextBox3.Text = ""
Exit Sub
End If
quantite = CLng(Val(Me.TextBox3.Text))
prixTotal = prixUnit * quantite
Me.TextBox5.Text = Format(prixTotal, "0.00")

et pour Textbox4 :

Private Sub TextBox4_Change()
If Not IsNumeric(Me.TextBox4.Text) Then
MsgBox "Veuillez saisir un nombre valide pour le prix unitaire.", vbExclamation, "Erreur de saisie"
Me.TextBox4.Text = ""
Exit Sub
End If
prixUnit = CDbl(Me.TextBox4.Text)
Me.TextBox4 = Replace(Me.TextBox4, ".", Application.DecimalSeparator)
Me.TextBox4 = Replace(Me.TextBox4, ",", Application.DecimalSeparator)
Me.TextBox5 = CLng(Me.TextBox3) * prixUnit
End Sub
 

Pièces jointes

  • COMMANDE MATERIEL.xlsm
    38.6 KB · Affichages: 0

Statistiques des forums

Discussions
312 215
Messages
2 086 316
Membres
103 176
dernier inscrit
jean.yvesjean.yves