CommandButton.enabled = False ?? [Résolu]

cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 7 juin 2006 à 10:14 - Dernière réponse : jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention
- 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 !!!!!
Afficher la suite 

Votre réponse

32 réponses

Meilleure réponse
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 7 juin 2006 à 15:22
3
Merci
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 !

Merci mortalino 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de mortalino
Meilleure réponse
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 8 juin 2006 à 16:57
3
Merci
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

Merci jrivet 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de jrivet
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 7 juin 2006 à 10:36
0
Merci
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
Commenter la réponse de jrivet
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 7 juin 2006 à 10:37
0
Merci
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 #
Commenter la réponse de cs_casy
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 7 juin 2006 à 14:06
0
Merci
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
Commenter la réponse de cs_kouki69
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 7 juin 2006 à 14:36
0
Merci
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
Commenter la réponse de jrivet
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 7 juin 2006 à 14:43
0
Merci
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 ...
Commenter la réponse de cs_kouki69
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 7 juin 2006 à 14:50
0
Merci
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
Commenter la réponse de jrivet
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 7 juin 2006 à 15:12
0
Merci
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 ??
Commenter la réponse de cs_kouki69
demon_renard 34 Messages postés mercredi 16 juin 2004Date d'inscription 23 juin 2006 Dernière intervention - 7 juin 2006 à 15:54
0
Merci
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 ...
Commenter la réponse de demon_renard
valtrase 936 Messages postés lundi 19 janvier 2004Date d'inscription 17 mars 2017 Dernière intervention - 7 juin 2006 à 21:11
0
Merci
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é
Commenter la réponse de valtrase
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 8 juin 2006 à 09:09
0
Merci
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
Commenter la réponse de jrivet
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 8 juin 2006 à 09:23
0
Merci
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.
Commenter la réponse de cs_kouki69
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 8 juin 2006 à 09:59
0
Merci
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
Commenter la réponse de jrivet
demon_renard 34 Messages postés mercredi 16 juin 2004Date d'inscription 23 juin 2006 Dernière intervention - 8 juin 2006 à 14:27
0
Merci
Encore moi ,
Comme pour le Me, essais de mettre le nom de ta userform devant CommandButton3.Enabled CmdEnable, cela donne nomDeTaUserform.CommandButton3.Enabled CmdEnable
Commenter la réponse de demon_renard
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 8 juin 2006 à 14:47
0
Merci
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 !!!
Commenter la réponse de cs_kouki69
demon_renard 34 Messages postés mercredi 16 juin 2004Date d'inscription 23 juin 2006 Dernière intervention - 8 juin 2006 à 14:59
0
Merci
Rajoute le else après le if, ça devrait correspondre à tes besoins :

If Ctrl.Text = "" Then CmdEnable = False
Else: CmdEnable = True
end if
Commenter la réponse de demon_renard
cs_kouki69 95 Messages postés lundi 27 mars 2006Date d'inscription 28 août 2015 Dernière intervention - 8 juin 2006 à 15:16
0
Merci
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 ...
Commenter la réponse de cs_kouki69
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 8 juin 2006 à 15:20
0
Merci
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
Commenter la réponse de jrivet
demon_renard 34 Messages postés mercredi 16 juin 2004Date d'inscription 23 juin 2006 Dernière intervention - 8 juin 2006 à 15:51
0
Merci
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                                     ' **
Commenter la réponse de demon_renard

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.