XL 2016 Incompatibilité de type ?

troopers87

XLDnaute Occasionnel
Bonsoir à tous,

J'ai un petit souci dans le contrôle de mon userform :
je souhaite bloquer l'accès au CommandButton1 tant que l'utilisateur n'a pas saisit une valeur dans la Textbox1.

Le problème, c'est que lorsque l'utilisateur se trompe dans sa saisie et efface sa saisie, il reçoit le message d'erreur :
Erreur d'exécution 13 : Incomptabilité de type
.
Voici mon code :
VB:
Private Sub Textbox_montant_depenses_change()
'si quelque chose est saisi dans la textbox1, alors le bouton d'incorporation des données dans la feuille Excel s'affichent
If TextBox1.Text <> "" Or TextBox1.Text <> 0 Then
CommandButton2.Enabled = True
End If
End Subs

Merci d'avance pour votre aide !
 

max.lander

XLDnaute Occasionnel
Bonjour à tous,

troopers87, ton code n'est pas très cohérent si je comprends bien ta demande.

Tu dois utiliser la propriété ".value" pour tes "textbox" et modifier tes conditions tout en y ajoutant une instruction Else comme ci-après:


Code:
Private Sub Textbox1_change()

If TextBox1.Value = 0 Or TextBox1.Value = "" Then
CommandButton2.Enabled = False

Else

CommandButton2.Enabled = True

End If
End Sub


Aussi il te faut désactiver le bouton dès le départ soit en modifiant la propriété Enable avec False dans la liste des propriétés soit avec l’événement user form initialize comme celà :

Code:
Private Sub UserForm_Initialize()
CommandButton2.Enabled = False
End Sub



Aussi l’événement Change doit concerné la textbox1 et non "Textbox_montant_depenses_change".

Sinon il faut corriger le nom de tes objets.


A+
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Non, c'est bien d'utiliser la propriété Text au lieu de Value: ça évite l'illusion que ça puisse être autre chose qu'un String de toute façon.
Le problème vient de ce qu'en voulant le comparer à 0 il doit essayer de le convertir en nombre, et c'est là que ça pose problème si c'est impossible.
 

Dranreb

XLDnaute Barbatruc
Il n'y en a pas justement, c'est bien ça le problème. La propriété Value est seulement là pour que ce contrôle ait une propriété Value comme toutes les contrôles, mais ce n'est qu'une copie de sa véritable propriété qui est Text et ne peut être que String. Je trouve qu'utiliser Value entraine une confusion parce qu'on risque de croire que s'il contient une suite de caractères chiffres sa Value sera un nombre, or ce n'est pas le cas, ce sera toujours un texte.
 

max.lander

XLDnaute Occasionnel
Ok VBA toujours aussi surprenant !

En PJ me proposition avec value ! mais je suis incapable de proposer une solution avec
.text

Si quelqu'un a une idée je suis preneur on en apprend tous les jours !

A+
 

Pièces jointes

  • Test.xlsm
    17.5 KB · Affichages: 31

Dranreb

XLDnaute Barbatruc
Il est possible qu'il y ait quand même une différence entre Text et et Value
Mais je n'ai pu trouver confirmation sur le Net.
Value serait un Variant/String tandis que Text serait un String
En tout cas moi je travaille toujours avec Text.
Je ferais comme ça :
VB:
Private Sub Textbox1_change()
If IsNumeric(TextBox1.Text) Then
  CommandButton2.Enabled = CDbl(TextBox1.Text) <> 0
Else
  CommandButton2.Enabled = TextBox1.Text <> ""
  End If
End Sub

Remarque thebenoit59: "00" <> CStr(0) parce que CStr(0) c'est "0"
 
Dernière édition:

troopers87

XLDnaute Occasionnel
Bonjour à tous !

Effectivement, je pensais utiliser à bon escient la propriété .Text mais effectivement, en remplaçant par la propriété .Value, le message d'erreur n'apparaît plus. Cette solution me convient d'autant plus que l'utilisateur final doit y saisir un nombre.

VB:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 
'empêcher la saisie de texte dans la textbox1
If InStr("1234567890,.", Chr(KeyAscii)) = 0 Then KeyAscii = 0

'dans la textbox1: si un point est saisi, le remplacer par une virgule
If KeyAscii = 46 Then KeyAscii = 44

End Sub

En fait, mon code est cohérent, mais pour vous en simplifier la compréhension, je l'avais trop raccourci : je désactive bien le CommandButton1 à l'initialisation du Userform, par exemple.

Merci pour vos réponses et enseignements !
 

Si...

XLDnaute Barbatruc
Salut

Un exemple sans .Value ni .Text
VB:
Private Sub Tmd_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If InStr("-1234567890,.", Chr(KeyAscii)) = 0 Then KeyAscii = 0 ‘- pour l’exemple
  If KeyAscii = 46 Then KeyAscii = 44
End Sub
Private Sub Tmd_Change()
  Tr = ""  'pour l'exemple
  CommandButton2.Enabled = IsNumeric(Tmd)
End Sub
 

Pièces jointes

  • TextBox (Usf).xlsm
    21.5 KB · Affichages: 30

troopers87

XLDnaute Occasionnel
Heu, c'est tout simplement génial, Si !

J'ai une interrogation sur l'interprétation de cette partie du code :
VB:
Private Sub Tmd_Change()
  Tr = ""
  CommandButton2.Enabled = IsNumeric(Tmd)
End Sub

D'après ce que je comprends, cela permet d'activer le CommandButton2 si le contenu de la textbox Tr est numérique.
D'habitude, j'ai tendance à mettre du If, Else et End if pour gérer ce genre de condition... ?
 

Si...

XLDnaute Barbatruc
re
D'après ce que je comprends, cela permet d'activer le CommandButton2 si le contenu de la textbox Tr est numérique.
D'habitude, j'ai tendance à mettre du If, Else et End if pour gérer ce genre de condition... ?
pas toutà fait, c'est le contenu de Tmd qui décide.
upload_2016-7-18_12-8-44.png


CommandButton2.Enabled attend True ou False
IsNumeric(TMD)
renvoie True ou False

Donc, ici, CommandButton2.Enabled prend la valeur de IsNumeric(TMD)
 

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 248
dernier inscrit
Happycat