Problème avec checkbox

Résolu
Signaler
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015
-
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015
-
bonjour,

J'ai un problème pour "récupérer" la caleur d'une checkbox dans un module.

voici  le code de ma checkbox :

Public Sub TextBox1_Change()

If TextBox1.value = "" Then
    TextBox1.value = 32
ElseIf Not IsNumeric(TextBox1.Text) Then
    Cancel = True
    MsgBox "veuillez entrer un nombre"
Else
    val = TextBox1.value
End If

End Sub

Et j'ai ça dans mon module : (j'ai ajouté public val as integer au début)

Call Sheets(1).TextBox1_Change
MsgBox val

le problème c'est que j'ai toujours val égal à 0.

20 réponses

Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
d'ailleur au lieu de MsgBox "veuillez entrer un nombre"
mets textbox1 = inputbox(......)

 Drikce 06
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonjour,

j'espère que tu as quand même donné un autre nom que Val à ta variable publique... (val étant un mot réservé)

Comme celà t'a été signalé, il vaudrait mieux utiliser une inputBox pour celà. Personnellement, je l'initierais de surcroît avec la valeur par défaut 32.


Une autre solution serait sans doute d'utiliuser la textbox, mais avec une boucle While dans le lostfocus (ou l'équivalent du lostfocus sous VBA) :

Quelque chose ressemblant à ceci :

Private Sub Text2_LostFocus()
  While Not IsNumeric(Text2.Text) Or Text2.Text = ""
    Text2.SetFocus
    Text2.Text = "32"
    Text2.SelStart = Len(Text2.Text)
    DoEvents
  Wend
End Sub

Qui permettrait de surcroît à l'utilisateur de bien voir que la valeur 32 a été donnée par défaut.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Salut,

prend le temps de lire et de comprendre les réponses qu'on te donne ...
Change le nom de ta variable Val par autre chose. Et fais attention aux noms que tu donnes à celles-ci.

Tout en gardant l'idée de JMF, voici ce que tu pourrais utiliser sous Excel

Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  While Not IsNumeric(TextBox1.Text) Or TextBox1.Text = ""
    TextBox1.SetFocus
    TextBox1.Text = "32"
    TextBox1.SelStart = Len(TextBox1.Text)
    DoEvents
  Wend
End Sub

Le seul problème que je peux voir, c'est si Textbox1 ne contient rien et rien n'y est écrit, ça ne générera pas d'erreur. L'utilisateur pourra quand même continuer à utiliser le reste des commandes... Peut-être devrais-tu mettre 32 comme valeur par défaut, dès l'ouverture.

MPi
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
Salut checkbox ou textbox?

 Drikce 06
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
Salut,

P'tite question ... Pourquoi appeler l'evénement Change de ta TextBox ? Techniquement correct, mais curieuse façon de procéder. Utilises plutôt une procédure à part.

Le texte tapé dans une TextBox est associé au paramètre Text, pas (il me semble) au paramètre value.

Si tu utilises TextBox1.Text, tu devrais voir les choses changer.







Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
22
A bien y regarder, finalement, .Value contient le contenu de .Text

Bon ... J'ai mis ton code tel quel dans un module (le Call) et le reste dans le code associé à la TextBox.
Et bien je récupère la valeur de val sans problème.
Il y a donc une info qui nous manque pour que çà foire chez toi ...







Manu


--------------------------------------------------------------------------------------------
Avant de poster un message, n'oubliez pas de consulter le reglement.
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

bon, ben en fait je suis un peu (très ?) bete.
c'était pas très compliqué. il fallait dans la procédure de la textbox écrire : Module1.val=textbox1.value à la place.
sinon, merci Dricke, je connaissais pas les inputbox, et effectivement c'est bien adapté dans mon cas :-)

pour répondre à econs, ce que j'ai ne marche pas tel quel.
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

le code de la textbox est bien écrit dans une feuille, et pas dans un module. écrit dans un module, ca marche comme tu dis effectivement
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

j'ai un nouveau pbm avec ma textbox :

Public Sub TextBox1_Change()
If TextBox1.value = "" Then
    Module1.val = 32
ElseIf Not IsNumeric(TextBox1.value) Then
    Reponse = InputBox("Veuillez entrer un nombre")
Else
    Module1.val = TextBox1.value
End If
TextBox1 = Reponse
End Sub

en fait, je voudrais une inputbox qui apparait tant que l'on a pas saisi une valeur numérique, et que cette valeur s'affiche ensuite dans la textbox
ici, une fois qu'on a saisi une valeur numérique dans la inputbox, cette valeur s'affiche dans la textbox. mais avec ce code, après, on ne peut plus effacer la valeur entree dans la textbox (je ne sais pas pourquoi )
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

Salut MPi !

Oui, effectivement j'ai pris en compte les remarques à propos de Val. j'ai donné ce nom dans l'exemple sur le forum car le vrai nom commence par Val.
je ne savais pas que c'était un mot réservé. merci pour l'info.

par rapport à ce que tu as écris, j'ai essayé mais ça ne fonctionne pas. d'ailleurs je ne peux pas non plus tester cette procédure.
J'ai essayé diverses solutions, fais des recherches, mais je ne trouve pas d'issue pour le moment; je suis un peu bloqué

Auriez vous une autre solution à me proposer ? ou une piste qui pourrait me guider ?

Merci !!
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

j'ai pensé à une solution, mais je ne sais pas si c'est possible à mettre en place. j'ai quelque chose comme ça :

Private Sub TextBox1_change()
    While Not IsNumeric(TextBox1.value)
        Reponse = InputBox("Veuillez entrer un nombre")
    If IsNumeric(TextBox1.value) Then
        Module1.val_test = TextBox1.value
        TextBox1.value = Reponse
    End If
    Wend

end sub

et avant le while, je met quelquechose comme : "onclick", on efface le contenu de la textbox. mais l'évènement "onclick" n'existe pas :-(
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
si tu utilises la virgule comme séparateur décimal et que tu tiens à l'événement change, essaye ceci :

Private Sub Text1_Change()
  Static toto As String
  If Not IsNumeric(Text1.Text) Then
    Text1.Text = toto
    Text1.SelStart = Len(Text1.Text)
    Exit Sub
  End If
  toto = Text1.Text
End Sub

mais prevois donc une mise à 32 au lostfocus si l'utilisateur n'a rien saisi.
Il se peut également qu'il te faille, sous VBA, modifier Text1.Text par Text1.Value (partout ou il y a écrit Text1.Text.... vérifie ce point)
Je vois ici :
http://msdn2.microsoft.com/en-us/library/aa220898(office.11).aspx
que Lostfus est géré sous VBA
et ici :
http://users.skynet.be/micdub/xlmulti.htm
que setfocus est également géré

donc :

Private Sub Text1_Change()
  Static toto As String
  If Not IsNumeric(Text1.Text) Then
    Text1.Text = toto
    Text1.SelStart = Len(Text1.Text)
    Exit Sub
  End If
  toto = Text1.Text
End Sub


Private Sub Text1_LostFocus()
  If Text1.Text = "" Then
    Text1.Text = 32
    Text1.SetFocus
  End If
End Sub
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Et si tu as abandonné l'idée du 32 par défaut :
Private Sub Text1_LostFocus()
  If Text1.Text = "" Then
    Text1.SetFocus 'sans mettre à 32 mais en y retournant...
   'beep  'situ veux en plus alerter par un bip et que VBA gère le bip)
  End If
End Sub
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Juste pour me rassurer... sous quel(s) logiciel(s) programmes-tu ?

Si c'est bien Excel comme dit au début, quel genre de textbox utilises-tu ?
sur un UserForm ?
sur la feuille directement avec les outils "Formulaire" ? ou avec les outils VB ?

MPi
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

Salut MPi,
je suis sous Excel2003. la textbox est sur la sheet1, pas dans un userform. je l'ai inséré avec la control toolbox.
je devrais utiliser un userform ??
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

salut jmfmarques,

merci pour ta réponse,
malheureusement ca ne fonctionne pas cette solution.
j'ai une erreur "object required" au niveau du "If Not IsNumeric(Text1.Text) Then" et du "If Text1.Text = "" Then"
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

jmfmarques> en fait voila les erreurs que j'ai avec le code que tu as écris:

s'il n'y a rien dans la textbox, 32 y est affiché et j'ai un message d'erreur "object doesn't support this property or method"
je ne peux pas écrire de caractères
si j'entre un nombre, je ne peux plus effacer le 1er chiffre
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Le code que je t'ai donné correspond à l'utilisation d'une Form (UserForm sous VBA), pas à des contrôles placés sur ta feuille Excel.
Il es testé sur une Form en VB (je n'ai pas VBA) mais sais qu'il marche avec VBA (sur une UserForm)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
et si tu veux pouvoir effacer le 32 mis par défaut, fastoche non ?

Regarde :

Private Sub Text1_Change()
  Static toto As String
  If Not IsNumeric(Text1.Text) And Text1.Text <> "" Then
    Text1.Text = toto
    Text1.SelStart = Len(Text1.Text)
    Exit Sub
  End If
  toto = Text1.Text
End Sub

T'es bien réveillé ?
Messages postés
38
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
25 février 2015

bon, finalement j'ai pu trouver une solution en utilisant un user form.
je n'avais pas compris que la solution que vous proposiez demandait de passer par le user form. je pense que j'avais pas expliqué assez clairement mon problème.
en tout cas, avec le user form, effectivement ça marche :-)

merci beaucoup pour votre aide MPi et jmfmarques !!