Enable/Disable bouton dans un userform

Hello,

Svp je cherche à mettre en sorte que mon bouton ne s'active que lorsque j'aurais rempli tous les champs du formulaire. J'ai essayé plusieurs codes trouvés sur le forum mais je n'arrive pas à superposer les conditions et surtout je ne sait pas comment raisonner (je ne sais pas si je dois faire _Change OU _Exit OU _AfterUpdate et sur quelle ligne) + même quand je réussi à remplir les champs de mon formulaire et que le bouton s'active, il reste actif même quand je supprime le contenu des champs.

Est-ce que quelqu'un pourrait m'éclairer sur comment faire svp ?

PS : j'aurais besoin également de bloquer l'accès au mode développeur (ou le protéger) pour que personne ne puisse s'amuser à modifier mon code, au cas quelqu'un saurait comment faire.

Merci d'avance.

Bonjour Ronnie45,

Supposons que tu veuilles mettre l’événement sur le Combobox ...

Le txtDate n’est pas mentionné ... puisqu’il se remplit automatiquement

Private Sub cboVille_AfterUpdate()
If txtNom.Value <> "" And txtN.Value <> "" And cboVille.ListIndex > -1 Then
    MsgBox "Merci de remplir tous les champs !"
    btnImprimer.Enabled = True
    txtNom.SetFocus
Else
    btnImprimer.Enabled = False
End If
End Sub

ric

Hello ric,

Merci pour ta réponse. Le code que t'as proposé marche bien mieux que le mien, cependant j'ai réussi à activer le bouton Imprimer sans même avoir renseigné le nom ou la ville, voir même le contraire comme le montre les photo en bas (lorsque je saisie, le bouton Imprimer s'active mais reste actif même après avoir supprimer le nom ).

image image

J'ai essayé ce code mais ca ne marche pas.

'bloquer la ligne N°CIN à 8 caractères
'******************************
Private Sub txtN_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtN.Value) <> 8 Then
MsgBox "Le numéro de série doit être composé de 8 caractères ! "
btnImprimer.Enabled = False
txtN.SetFocus
Else
btnImprimer.Enabled = True
End If
End Sub

'renseinger nom et ville impérativement
'******************************
Private Sub cboVille_AfterUpdate()
If txtNom.Value <> "" And Len(txtN.Value) <> 8 And cboVille.ListIndex > -1 Then
    btnImprimer.Enabled = True
    txtNom.SetFocus
    cboVille.SetFocus
Else
    btnImprimer.Enabled = False
End If
End Sub

Comment pourrais-je régler ça ? Merci.

Bonjour Ronnie45,

Ainsi ... cela est-il mieux ?

Pour que la condition du 8 caractères s'avère ... il faut un =

'bloquer la ligne N°CIN à 8 caractères
'******************************
Private Sub txtN_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(txtN.Value) <> 8 Then     ' si pas 8 caractères ... msgbox ... c'est bon
   MsgBox "Le numéro de série doit être composé de 8 caractères ! "
   btnImprimer.Enabled = False
   txtN.SetFocus

ElseIf txtNom.Value <> "" And And cboVille.ListIndex > -1 Then  '' ici, pas besoin de la condition, elle est validée d'elle-même à l'étape au dessus ... si différent de 8 msgbox ... sinon (ElseIf) donc le len de 8 est déjà validé
    btnImprimer.Enabled = True  ' << ici une seule condition active le bouton, si 8 caractères
End If
End Sub

'renseigner nom et ville impérativement   
'******************************
Private Sub cboVille_AfterUpdate()
If txtNom.Value <> "" And Len(txtN.Value) = 8 And cboVille.ListIndex > -1 Then  '' ici, il faut Len(txtN.Value) = 8 afin que la condition s'avère ...
    btnImprimer.Enabled = True
    txtNom.SetFocus
    cboVille.SetFocus
Else
    btnImprimer.Enabled = False
End If
End Sub

ric

Hello ric,

C'est parfait pour réaliser la condition des 8 caractères, cependant toujours le même problème au niveau de la textbox Nom (photo ci-dessous), le bouton reste actif même après avoir supprimé mon champs. J'ai besoin que si la txt.value <> "", le bouton reste grisé.

image

J'ai une autre question si possible, c'est quoi la différence entre

_Exit (ByVal Cancel As MSForms.ReturnBoolean)
_AfterUdpdate()
...

?

Bonjour Ronnie45,

Il faut ajouter cette procédure ...

C’est-à-dire ... imposer aussi dans ce textbox les conditions voulues pour le bouton ...

Private Sub txtNom_Change()
   '' ici sur txtNom tu pourrais imposer un nombre minimum de caractères ... 
   '' si tu fais cela, il faudra aussi modifier les 2 autres endroits où il y a vérification des conditions pour l’accès au bouton ... zou pas ...
    If txtNom.Value <> "" And Len(txtN.Value) = 8 And cboVille.ListIndex > -1 Then 
        btnImprimer.Enabled = True
    Else
        btnImprimer.Enabled = False
    End If
End Sub

ric

Hello ric,

Merci pour ton retour et désolé pour le retard mais je n'avais plus accès à mon pc depuis quelques jours.

Pour ta solution je l'ai essayé sur un second fichier (à plus grande échelle) mais ca ne marche pas, j'ai l'impression qu'il faut suivre un ordre bien déficit pour que ca marche. Et même quand j'arrive à activer le bouton il reste actif. J'ai tout essayé

Y'a t-il pas une autre méthode dans laquelle il n'y aurait qu'une seule private sub pour éviter de suivre un ordre particulier ? Par exemple

If txtNom.Value <> "" And Len(txtN.Value) = 8 And cboVille.ListIndex > -1 Then 

 btnImprimer.Enabled = True

 Else

 btnImprimer.Enabled = False

 End If

Bonjour,

Ton fichier de départ ...

Est-ce mieux ?

' j'ai changé ceci
''Private Sub txtN_Exit(ByVal Cancel As MSForms.ReturnBoolean)

' pour cela
Private Sub txtN_AfterUpdate()

Le textbox

ric

Re ric,

Sur le fichier que j'avais envoyé ça marche bien, merci beaucoup. Cependant j'ai essayé avec un autre et là j'ai pleins de bugs.

Dans ce fichier j'aimerais que le bouton imprimer dépende de 3 champs obligatoires (cboAgent, txtNum et cboD2). J'ai essayé la même méthode que celle que j'avais utilisé sur mon premier fichier mais j'ai encore beaucoup de bug (quand je change de ville et le cboD2 se réinitialise, le bouton reste actif ou encore quand je renseigne le cboAgent en dernier le bouton ne s'active même pas...)

J'ai gardé le même code mais ca ne marche pas, est-ce que t'aurais une idée sur ce que je pourrais modifier s'il te plaît ?

4ronnie-test.xlsm (51.49 Ko)

Bonjour Ronnie45,

Pour que le bouton "imprimer" devienne actif ... quels sont les éléments à tester ... les 3 du haut ... Nom, Agent et Numéro ?

Car là ... il y n'a a pas de condition sous Agent ... "Private Sub cboAgent_Change()" n'existe même pas ...

La condition n'est seulement que sous "CboD2" = "Supplément" ...

Peux-tu me dire quels éléments sont à tester ?

ric

Salut ric,

Merci pour ton retour. Les éléments à tester sont Numéro "txtNum", Agent "cboAgent" et Supplément "cboD2".

Pour l'agent j'ai essayé de l'insérer avec le cboD2 comme sur le premier fichier dans un premier temps, ca n'a pas marché, j'ai essayé d'ajouter la condition cboAgent comme sur ce fichier et ca marche plutôt bien.

3ronnie-test.xlsm (51.63 Ko)

Ca marche mieux mais j'ai toujours certains bugs, en particulier lorsque je réinitialise le supplément cboD2 (le bouton reste actif) ou encore le fait de devoir cliquer sur une textbox pour actualiser le formulaire et enable de bouton imprimer.

image

Bonjour Ronnie45,

Un essai ...

Si l'un des 3 contrôles concernés ne répond pas aux critères ... btnImprimer n'est pas ou n'est plus accessible ...

Note : cbod2 n'était pas alimenté ... voir > userform_initialize ...

ric

5ronnie-test-2.xlsm (50.12 Ko)

Hello ric,

Merci pour la rectification, et effectivement ca marche beaucoup mieux.

Le seul bémol c'est qu'après avoir tout renseigné, il faut encore appuyer sur un champs ou cliquer sur Entrer pour activer le bouton. Donc j'imagine que cela vient de l'AfterUpdate.

Y'a-t-il pas un moyen d'automatiser l'activation du bouton "Imprimer" ? (juste une question d'ergonomie)

image

Bonjour Ronnie45,

Si l'on ne renseigne que les 3 champs concernés ... ça fonctionne correctement ... je n'avais pas testé en renseignant d'autres champs qui ... il faut le dire ... ont une certaine interactivité interférente ...

Je regarde dès que possible ...

ric

Salut ric,

D'accord pas de soucis. La condition d'obligation n'est appliqué que pour les 3 variables que j'ai renseigné et ta solution marche déjà très bien, j'ai juste besoin d'améliorer l'ergonomie du userform en faisant en sorte que le bouton s'active automatiquement sans devoir cliquer sur un autre champs.

Bonjour Ronnie45,

J'ai déplacé la vérification des 3 contrôles vers une procédure indépendante BoutonImprimerActifInactif ... puis dans les textbox et combobox ... j'en fait l'appel ... call BoutonImprimerActifInactif ...

Ça semble fonctionner correctement ...

ric

6ronnie-test-3.xlsm (57.79 Ko)

C'est parfait !

C'est ce que je cherchais depuis le début. Merci beaucoup ric.

Bonjour Ronnie45,

Excellent ...

Tu vois comme mon âne est réjoui ...

ric

Rechercher des sujets similaires à "enable disable bouton userform"