CommandButton.enabled = False ??

Résolu
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015 - 7 juin 2006 à 10:14
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 - 8 juin 2006 à 17:36
Bonjour,
Voilà, j'ai créé dans un userform un bouton "NEXT" que je souhaite avoir grisé tant que toutes les cellules( textbox, ComboBox ...) ne sont pas remplies. Lorsque toutes les cellules du userform sont remplies, à ce moment là, le bouton "NEXT" n'est plus grisé et est donc actif pour passer au userform suivant.
J'ai déjà utilisé ce principe dans un userform qui ne comptait que deux cellules à remplir et j'ai utilisé les lignes suivantes et qui fonctionne bien :

Private Sub speed_Change()
If UserForm1.speed.Value = "" Then
UserForm1.CommandButton1.Enabled = False
Else
  If UserForm1.Textetoi.Value = "" Then
    UserForm1.CommandButton1.Enabled = False
    Else
          CommandButton1.Enabled = True
   End If
End If

MAINTENANT, j'ai une trentaine de cellule à remplir et je ne crois pas que les lignes ci-dessus soit la meilleure façon de faire !!!
N'y a t-il pas moyen de dire : Si toutes les cellules du userform ne sont pas remplies, alors bouton grisé, autrement, bouton actif !!

Merci de votre aide !!!!!

32 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 juin 2006 à 15:22
Salut,

tu peux tester lors de l'appuie sur le bouton :

Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Dim ctl As Control

For each ctl in UserForm.Controls
If TypeName(ctl) = "TextBox" Then
If ctl.Value = "" Then
MsgBox "Vous devez remplir tous les champs !"
Exit Sub
End If
End If
Next ctl

Ton code ici, qui sera executé si et seulement si toutes les textbox sont remplis.

End Sub

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement !
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
8 juin 2006 à 16:57
Dans ce cas.

La procedure suivante dans UserForm5

Public Sub boutongrisé() 
Dim Ctrl As Control 
Dim CmdEnable As Boolean 
'Par defaut on admet que le bouton est Enable
CmdEnable = True 
'For Each Ctrl In UserForm5.Controls
For Each Ctrl In Me.Controls 
    'Si le controle est de type textbox
    If TypeOf Ctrl Is MSForms.TextBox) Or TypeOf Ctrl Is MSForms.ComboBox) Then 
        'Si le contenu du textbox est vide
        If Ctrl.Text = "" Then CmdEnable = False 

    End If 
Next 
CommandButton3.Enabled = CmdEnable 
End Sub 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Qui est a peu de chose près (j ai juste rajouter les combobox) celle que j avais deja propose.

Ensuite dans TOUT les événements _CHANGE des combobox ET textbox

CAll BoutonGrisé (NOTE: Eviter les accent dans les codes)

Et la si ca ne marche pas....

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 10:36
Salut,

essaie ceci
Le code suivant verifie tout les textbox du UserForm, Si il y a des combo box il faudra ajouter des conditions sur le TypeOF
Dim Ctrl As Control 
Dim CmdEnable As Boolean 
'Par defaut on admet que le bouton est Enable
CmdEnable = True 
For Each Ctrl In Me.Controls 
    'Si le controle est de type textbox
    If TypeOf Ctrl Is MSForms.TextBox Then 
        'Si le contenu du textbox est vide
        If Ctrl.Text = "" Then CmdEnable = False 
    End If 
Next 
CommandButton1.Enabled = CmdEnable 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 juin 2006 à 10:37
tu peux faire une double boucle par exemple :

Bouton.enabled =true
for i=1 to nb_colonne
    for j=1 to nb_ligne
       if cellule(i,j)="" then bouton.enabled=false
    next
next

A adapter bien sur à ton code.

<hr /># Le partage est notre force #
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
7 juin 2006 à 14:06
Réponse à JRIVET,
Ca ne marche pas, le bouton reste grisée. Je n'ai considéré que les textbox pour tester. Bien que je complète toutes les textbox, le bouton reste grisée.
J'ai mis la commande dans Userform_Activate()
Une idée ??
Merci
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 14:36
Salut,

Si le cheminement de ton programme est le suivant.

Chargement du Userform (LEs Champs sont ils vide à ce moment là????)
Activate. (Si les champs sont vide le code grisera le bouton..)

Tu remplis les textes box...

Est ce que le code que je t'ai proposé est alors réexecuté?

Peu être dois tu passer par un Timer pour executer ce code.

Ou alors l'appeler après chaque appui sur Enter dans chaque textbox.

Si le code est executé qu une fois, c'est normal que cela ne marche pas.
Je l'ai testé avant de te le proposer et ca marchait tres bien. la seule différence c'est que pour la simplicité je suis passer par un command button

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
7 juin 2006 à 14:43
Les champs ne sont pas forcément vide.
Il semble que le code est exécuté qu'une fois, au moment de l'activation du userform (userform_1ctivate(). Il faudrait que le code soit exécuté à chaque fois qu'une valeur est entrée ds les textbox et les combobox.
Appeler après chaque appui sur enter, bof car on peut passer d'une cellule à l'autre soit avec tab, souris, enter, flèche ...
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
7 juin 2006 à 14:50
salut,

Après tu fais comme tu le souhaites,

Mais si le code n'est executé fois dis toi que si un des champs est vide, c'est mort le bouton sera griser.

Mais le code tu n'a qu'a le mettre dans une fonction que tu appelles dès qu il y a un changement dans les textbox (événements change de chaque textbox et ComboBox, ou alors événement keypress)

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
7 juin 2006 à 15:12
O.K,
J'appelle le sous programme lorsque chaque textbox est modifié :

Private Sub TextBox2_Change()
Call bouton_grisé



End Sub
 Puis :
Public Sub bouton_grisé()
Dim Ctrl As Control
Dim CmdEnable As Boolean
'Par defaut on admet que le bouton est Enable
CmdEnable = True
For Each Ctrl In Me.Controls
    'Si le controle est de type textbox
    If TypeOf Ctrl Is MSForms.TextBox Then
        'Si le contenu du textbox est vide        If Ctrl.Text "" Then CmdEnable False
    End If
Next
CommandButton1.Enabled = CmdEnable

Lorsque bouton_grisé est exécuté, j'ai un message qui me dit :
Erreur de compilation, utilisation incorrecte du mot clé Me

Une idée ??
0
demon_renard Messages postés 34 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 23 juin 2006
7 juin 2006 à 15:54
Salut,

Si tu as mis ta fonction ailleurs que dans ta userform essaie de remplacer le mot clé Me par le nom de ta userform, ça devrait marcher ...
0
valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
7 juin 2006 à 21:11
Salut,
Le code de jrivet doit fonctionner avec une légère modif, en effet VBA ne reconnais pas tout le temps TypeOf
donc tu dois le remplacer par TypeName comme dans le code de Mortalino.
cette modif te permétra d'avoir le bouton grisé sans attendre l'appui .......

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
8 juin 2006 à 09:09
Salut,

>218510 valtrase: Desole de te contredire mais le code que j'ai déjà posté fonctionne très bien sous VBA Excel. Il ne fonctionne pas si tu ne mets pas MSForms.TextBox mais juste TextBox.

Dim Ctrl As Control 
Dim CmdEnable As Boolean 
'Par defaut on admet que le bouton est Enable
CmdEnable  = True 
For Each Ctrl In Me.Controls 
    'Si le controle est de type textbox
    If TypeOf Ctrl Is MSForms.TextBox Then 
        'Si le contenu du textbox est vide
        If Ctrl.Text = "" Then CmdEnable = False 
    End If 
Next 
CommandButton1.Enabled = CmdEnable 

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
8 juin 2006 à 09:23
Salut,
Si je met typeName à la place de typeOf, VBA me dit  : erreur de compilation , attendu Then ou GoTo,  en soulignant le Ctrl après TypeName.
Dans les 2 cas de toute façon, celà ne marche pas. Avec l'option TypeOF, la dernière ligne est contestée :
CommandButton3.Enabled = CmdEnable

Pour info, j'ai remplacé Me par le nom de mon userform comme conseillé par Demon_Renard.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
8 juin 2006 à 09:59
Re,

Ce que je n'arriverai jamais à comprendre c'est pourquoi un code fonctionnerait sur une machine et pas sur une autre.
C'est ca l'informatique

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
demon_renard Messages postés 34 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 23 juin 2006
8 juin 2006 à 14:27
Encore moi ,
Comme pour le Me, essais de mettre le nom de ta userform devant CommandButton3.Enabled CmdEnable, cela donne nomDeTaUserform.CommandButton3.Enabled CmdEnable
0
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
8 juin 2006 à 14:47
Effectivement, j'ai omis de mettre le nom de ma userform devant CommandButton3.enable.


Ceci dit, ça ne marche tjrs pas. Je n'ai pas d'erreur mais lorsque je complete la textebox, le bouton devient grisé, si je supprime le contenu de la textbox, le bouton reste grisé !!!Grrrrrr..
Comme je l'ai dit plus haut, je fais un call du programme lorsque la textbox est modifiée. Peut-être n'est ce pas la bonne méthode !!!
0
demon_renard Messages postés 34 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 23 juin 2006
8 juin 2006 à 14:59
Rajoute le else après le if, ça devrait correspondre à tes besoins :

If Ctrl.Text = "" Then CmdEnable = False
Else: CmdEnable = True
end if
0
cs_kouki69 Messages postés 95 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 28 août 2015
8 juin 2006 à 15:16
Il y a une amélioration. J'ai du mettre un commandbutton.enable = false dans le userform_activate() pour que le bouton soit grisé dès l'ouverture de l'userform.  Le bouton devient actif lorsque j'entre une valeur dans la text ebox. Le pb c'est que je souhaite que le bouton reste grisé tant que toute les autres textebox ne sont pas remplies. Autre problème, si j'éfface la valeur de la textebox, le bouton rest eactif alors qu'il devrait revenir grisé !
Je crois que je vais abandonner et rester sur une solution intermédiaire propoé par Mortalino (qd je clique sur le bouton, j'ai un message si toutes les textbox, combobox ne sont pas remplies.
Merci qd même, dommage ...
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
8 juin 2006 à 15:20
Salut,

S'il n est pas trop gros, je te propose de me l'envoyer (si ca te dit) en me reexplicant ce que tu souhaite exactement.

Moi je suis resté sur :

- Tant que toutes les textbox ne sont pas remplies le bouton est grise. code que je t'ai proposé et qui marche. peu être n'est il pas utilisé correctement.

Enfin bref.

Envoie ton excel si ca te dit.

epsylon9@gmail.com

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
demon_renard Messages postés 34 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 23 juin 2006
8 juin 2006 à 15:51
rajoute les ligne qui ont des ** sa devrait marcher (chez moi en tout cas ca marche)
comme ça si une seule textBox est vide le CommandButton sera grisé

Dim Ctrl As Control
Dim CmdEnable As Boolean
Dim i As Integer               ' **
For Each Ctrl In Me.Controls
    'Si le controle est de type textbox
    If TypeOf Ctrl Is MSForms.TextBox Then
        'Si le contenu du textbox est vide        If Ctrl.Text "" Then i i + 1  ' **
    End If
Next
If i = 0 Then                           ' **
  CommandButton3.Enabled = True  ' **
Else                                        ' **
  CommandButton3.Enabled = False ' **
End If                                     ' **
0
Rejoignez-nous