Autres saisie obligatoire dans plusieurs textbox d'un userform

JOELJBJ

XLDnaute Nouveau
Bonjour à tous et mille bisous à celui qui va m'aider!!! Cela fait plusieurs heures que je galère avec un truc certainement trop facile... De plus (si possible ce serait parfait si cela fonctionne avec Excel 2007 et 2019)

J'ai un UserForm avec 8 TextBox et un Conbo

je voudrais bloquer le Btn enregistrer si les champs ne sont pas remplis

pas de format à respecter (c'est tout du texte)

J'y suis arrivé avec text1

Pprivate Sub txt1_change()
If txt1 <>"" Then
btn enregistrer .Enable=True
Else
btn enregistrer.Enable=False
End if
End Sub

Super ça marche

ça se complique quand je veux ajouter les autres, je cherche de l'aide!!!
au secourt...
Merci d'avance
JBJ
 
Solution
En fait pas besoin de code dans l'UserForm.

Il suffit de compléter la macro d'ouverture, voyez ce fichier (2) :
VB:
Sub OuvreFrm()
Application.OnTime 1, "Boutons_Enabled" 'lance le processus
frmSaisie.Show
End Sub

patricktoulon

XLDnaute Barbatruc
bonjour
tu peux te créer un event change de substitution comme ça on touche pas au code existant sauf dans le activate
cet event réagi a tout les textbox que tu a mis dans le activate dans une simple boucle
du genre comme ça
VB:
Public WithEvents txtb As MSForms.TextBox
Dim Cls(1 To 8) As New UserForm1


Private Sub txtb_Change()
    Dim x As Boolean
    x = True
    For i = 1 To 8
        If UserForm1.Controls("Textbox" & i) = "" Then x = False: Exit For
    Next
    UserForm1.CommandButton1.Enabled = x
End Sub

Private Sub UserForm_Activate()
   CommandButton1.Enabled = False
   For i = 1 To 8
        Set Cls(i).txtb = Me.Controls("Textbox" & i)
    Next
End Sub
1644698325985.png


démo
demo2.gif
 

Pièces jointes

  • bouton bloquer sur 8 textboxs avec au moins un vide .xlsm
    13.7 KB · Affichages: 14

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Joël, bonsoir le forum,

C'est plutôt sur le bouton Enregistrer qu'il faut agir avec un code du style :

VB:
Private Sub CommandButton1_Click()

'***********************************************
If Me.TextBox1.Value = "" Then
    MsgBox "Vous devez remplir ce champ !"
    Me.TextBox1.SetFocus
    Exit Sub
End If
'***********************************************

'ton code pour l'enregistrement
 End Sub

Répéter le code entre les lignes étoilées pour chaque contrôle obligatoire...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Si tu as beaucoup de contrôles obligatoires voici un petit exemple commenté.
J'ai affecté à la propriété Tag des textboxes, le numéro de la colonne où sa valeur doit être renvoyée.
J'ai rajouté "OB" à la fin du nom de chaque contrôle OBligatoire. Cela permet une boucle et évite de répéter le code de mon post précédent.
 

Pièces jointes

  • Exemple.xlsm
    24.1 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
re
bonsoir @Robert
ma méthode a un avantage c'est que c'est juste de l'ajout on ne modifie rien dans le code existant
on ajoute juste les deux lignes dans l'activate ou on veux
par exemple ici on a 8 textbox
imaginons qu'elle ai mis du code dans l'event change de chaque textbox
il pourrait être difficile d'intégrer un Contrôle de celui ci et les 7 autres sans perturber le reste du code

là je les classe et l'event de substitution est complètement indépendant de leur event original les deux peuvent cohabiter l'event du textbox1 si il a du code il fait son job
l'event de substitution quand le textbox1 change fait son job à lui

bon au début c'est un peu tordu a comprendre mais j’utilise assez souvent cette astuce

en plus c'est intra userform pas de module classe donc transportabilité 100%
 

JOELJBJ

XLDnaute Nouveau
bonjour
tu peux te créer un event change de substitution comme ça on touche pas au code existant sauf dans le activate
cet event réagi a tout les textbox que tu a mis dans le activate dans une simple boucle
du genre comme ça
VB:
Public WithEvents txtb As MSForms.TextBox
Dim Cls(1 To 8) As New UserForm1


Private Sub txtb_Change()
    Dim x As Boolean
    x = True
    For i = 1 To 8
        If UserForm1.Controls("Textbox" & i) = "" Then x = False: Exit For
    Next
    UserForm1.CommandButton1.Enabled = x
End Sub

Private Sub UserForm_Activate()
   CommandButton1.Enabled = False
   For i = 1 To 8
        Set Cls(i).txtb = Me.Controls("Textbox" & i)
    Next
End Sub
Regarde la pièce jointe 1130688

démo
Regarde la pièce jointe 1130690
Bonjour Patrick c'est super !!! cela fonctionne à merveilles. je ne m'en aurai pas sortie sans ton aide. Bravo tu touches un max, mille bisous comme promis...
 

JOELJBJ

XLDnaute Nouveau
Re,

Si tu as beaucoup de contrôles obligatoires voici un petit exemple commenté.
J'ai affecté à la propriété Tag des textboxes, le numéro de la colonne où sa valeur doit être renvoyée.
J'ai rajouté "OB" à la fin du nom de chaque contrôle OBligatoire. Cela permet une boucle et évite de répéter le code de mon post précédent.
Bonsoir Joël, bonsoir le forum,

C'est plutôt sur le bouton Enregistrer qu'il faut agir avec un code du style :

VB:
Private Sub CommandButton1_Click()

'***********************************************
If Me.TextBox1.Value = "" Then
    MsgBox "Vous devez remplir ce champ !"
    Me.TextBox1.SetFocus
    Exit Sub
End If
'***********************************************

'ton code pour l'enregistrement
 End Sub

Répéter le code entre les lignes étoilées pour chaque contrôle obligatoire...
Merci Robert tout cela va m'être bien utile, Patrick et toi vous êtes super cool! merci pour votre aide, Biz
 

Eric C

XLDnaute Barbatruc
Bonjour le forum
Bonjour JOELJBL, bonjour Robert, bonjour Patrick

Il est vrai que le code de notre ami Patrick est très intéressant. J'avais envisagé hier soir de mettre un code piqué à notre amie Laetitia90 et revisité mais il était sensiblement identique à celui de notre ami Robert (Utilisation du Tag) et comporte également un petit inconvénient : Si l'on sélectionne puis on efface le contenu d'un TextBox (obligatoire) par la touche "Espace", le bouton "Enregistrer" sera efficient contrairement au code utilisé par notre ami Patrick.
A méditer ....
Bonne fin de ouikand à toutes & à tous
@+ Eric c
 

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 175
Membres
112 677
dernier inscrit
Justine11