XL 2016 Utilisation de la fonction Me.Controls

dayyoni

XLDnaute Nouveau
Bonjour tout le monde, je suis débutant sur Excel.
j'ai créé un formulaire de création de compte utilisateur
je veux boucler sur mes CheckBox en cochant les cases de 1 à 17 en plaçant un "X" dynamiquement dans les cellules concernées de ma feuille "Administrateur" afin d'autoriser l’accès aux feuilles du classeur.
Cependant, j'ai une erreur avec la fonction Me.Controls("CheckBox" & i)

J'ai une autre solution qui consiste a alimenter directement les CheckBox en rajoutant à chaque fois une ligne par CheckBox !
If Me.CheckBox1 = True Then
mais x fois c'est .......................!!!!

Quelqu'un peut il m'éclairer car là, je suis bloqué !

Vous remerciant d'avance pour vos lumières.

Cordialement,

Voila mon code :

Private Sub CdtCreerUnCompte_Click()
'on définit les variables
Dim User As String 'utilisateur
Dim mdp As String 'mot de passe
Dim cnf As String 'confirmation
Dim Coché As Boolean 'case a coché
Dim Derl As Long 'remplissage de la dernière ligne
Dim Ws As Worksheet 'feuille matrice


Set Ws = Sheets("Administrateur") 'selection de la feuille Administrateur
Coché = False 'position de départ de la case (décoché)

'on vérifie que l'utilisateur à rempli tous les champs
If Me.TextBox1 = "" Or Me.TextBox2 = "" Or Me.TextBox3 = "" Then
MsgBox "Veuillez remplir tous les champs" 'message si champ manquant
Exit Sub 'on ferme la boite de dialogue
End If

User = Me.TextBox1 'on attribut les valeurs aux variables
mdp = Me.TextBox2
cnf = Me.TextBox3

For i = 1 To 17 'on crée une boucle de controle
'on vérifie si au moins une case est coché
If Me.Controls("CheckBox" & i) = True Then
Coché = True
End If
Next i 'on passe à létape suivante

If Coché = False Then 'si condition case coché est fausse, on a une alerte
MsgBox "Veuillez cochez au moins une feuille"
Exit Sub 'on ferme la boite de dialogue
End If 'on sort de la condition

'on définit la plage de cellules à remplir en fonction de la derniere ligne
Derl = Ws.Range("A" & Rows.Count).End(xlUp).Row + 1

For Each C In Ws.Range("A2:A" & Derl) 'on créer une boucle de vérification
If C = User Then 'pour les utilisateur que l'on rajoute
MsgBox "Ce nom d'utilisateur est déja utilisé, veuillez saisir un autre"
Exit Sub 'on ferme la boite de dialogue
End If 'on ferme la condition
Next

If mdp <> cnf Then 'pour le mot de passe créé
MsgBox "Les mots de passe ne sont pas identiques"
Me.TextBox2 = "" 'on vide les textbox
Me.TextBox3 = ""
Exit Sub 'on sort du programme
End If

If MsgBox("Voulez vous créer ce compte?", vbYesNo, "Création du compte") = vbYes Then
With Ws
.Range("A" & Derl).Value = User
.Range("B" & Derl).Value = mdp

For i = 1 To 17
If Me.Controls("CheckBox" & i) = True Then
.Cells(Derl, i + 2).Value = "X"
End If
Next i
End With
MsgBox "Ce compte a été créer avec succés"

'on libère l'espace mémoire


End If
Set Ws = Nothing
End Sub
 
Solution
bon a la bonne heure puisque ca se radouci on peut avancer
alors pour ton userform de creation de compte
tu va commencer par remplacer ceci
VB:
Private Sub UserForm_Activate() 'on définit les variables
Dim Ws As Worksheet
Dim Lr As Long

Set Ws = Sheets("Administrateur") 'on selectionne la feuille WS

Lr = Ws.Range("A" & Rows.Count).End(xlUp).Row 'on associe la variable Lr(last row) à la feuille Ws

If Lr > 1 Then  'on ouvre la condition pour alimenter la combobox
   For Each C In Ws.Range("A2:A" & Lr) 'on alimente la combobox
      Me.ComboBox1.AddItem C
   Next
End If

Set Ws = Nothing 'on detruit la fonction,permet de liberer l'espace mémoire

End Sub
par cela
VB:
Private Sub UserForm_Activate()    'on...

Robert

XLDnaute Barbatruc
Bonsoir Dayyoni, bonsoir le forum,

Si tu avais eu la bonne idée de fournir le fichier qui va bien, on aurait pu te donner une réponse plus sure !...
Pour moi, ton code est bon. Si ça plante au niveau de Me.Controls("CheckBox" & i) c'est qu'il doit y avoir une checkbox avec un nom qui ne correspond pas, CheckBox18 par exemple... Vérifie cela et si ça n'est pas ça, met le fichier en pièce jointe...

Pense aussi à mettre le code entre balises </> et à utiliser les indentations...
 

ChTi160

XLDnaute Barbatruc
Bonsoir dayyoni
Bonsoir Robert ,le Forum
Tu dis :
on vérifie si au moins une case est coché
donc tu pourrais mettre "Exit For"
VB:
'on vérifie si au moins une case est coché
If Me.Controls("CheckBox" & i) = True Then
Coché = True : Exit For 'ici
End If
Pour l'erreur :
Il aurait été bon de donner le texte du message d'erreur.
Et un fichier Exemple !
Jean marie
 

dayyoni

XLDnaute Nouveau
Bonsoir Dayyoni, bonsoir le forum,

Si tu avais eu la bonne idée de fournir le fichier qui va bien, on aurait pu te donner une réponse plus sure !...
Pour moi, ton code est bon. Si ça plante au niveau de Me.Controls("CheckBox" & i) c'est qu'il doit y avoir une checkbox avec un nom qui ne correspond pas, CheckBox18 par exemple... Vérifie cela et si ça n'est pas ça, met le fichier en pièce jointe...

Pense aussi à mettre le code entre balises </> et à utiliser les indentations...
Bonsoir Dayyoni, bonsoir le forum,

Si tu avais eu la bonne idée de fournir le fichier qui va bien, on aurait pu te donner une réponse plus sure !...
Pour moi, ton code est bon. Si ça plante au niveau de Me.Controls("CheckBox" & i) c'est qu'il doit y avoir une checkbox avec un nom qui ne correspond pas, CheckBox18 par exemple... Vérifie cela et si ça n'est pas ça, met le fichier en pièce jointe...

Pense aussi à mettre le code entre balises </> et à utiliser les indentations...
Bonsoir Robert,
je te remercie pour ton retour, je vais verifié tout cela.merci pour ton conseil!
Bonsoir Dayyoni, bonsoir le forum,

Si tu avais eu la bonne idée de fournir le fichier qui va bien, on aurait pu te donner une réponse plus sure !...
Pour moi, ton code est bon. Si ça plante au niveau de Me.Controls("CheckBox" & i) c'est qu'il doit y avoir une checkbox avec un nom qui ne correspond pas, CheckBox18 par exemple... Vérifie cela et si ça n'est pas ça, met le fichier en pièce jointe...

Pense aussi à mettre le code entre balises </> et à utiliser les indentations...
Bonsoir Robert,
merci pour ton retour et tes précieux conseils,
je te joints tout le fichier dans son intégralité ou juste la feuille concernée? je pense qu'il te faut tout pour tester!
Bien cordialement.
 

dayyoni

XLDnaute Nouveau
Bonsoir dayyoni
Bonsoir Robert ,le Forum
Tu dis :

donc tu pourrais mettre "Exit For"
VB:
'on vérifie si au moins une case est coché
If Me.Controls("CheckBox" & i) = True Then
Coché = True : Exit For 'ici
End If
Pour l'erreur :
Il aurait été bon de donner le texte du message d'erreur.
Et un fichier Exemple !
Jean marie
Bonsoir Chti160

Merci pour ton retour,
j'ai testé mais ça ne fonctionne pas.
je pense que c'est au niveau du nommage des checkbox, comme dit Robert.

Bien cordialement
 

soan

XLDnaute Barbatruc
Bonjour dayyoni, le fil,

ton fichier en retour. :)

* maintenant, il n'y a plus aucune erreur de compilation. 😊

* pour les erreurs d'exécution, je n'ai pas testé, à toi
l'honneur d'essayer. 😜

* s'il y a des erreurs de logique dans ton code VBA,
je te laisse le soin de les découvrir.

pour le SAV, je ne suis pas sûr qu'il y en aura. :rolleyes:
je croise les doigts pour que tout soit ok ! :p


soan
 

Pièces jointes

  • TBDPlanningDO creation compte.xlsm
    217.3 KB · Affichages: 8

Robert

XLDnaute Barbatruc
Bonjour le fil, bonjour le forum,

C'est bien ce que je pensais, tes checkboxes vont à 2 jusqu'à 18 !... Pourquoi tu n'as pas corrigé toi-même !?...
Le code adapté :

VB:
Private Sub CdtCreerUnCompte_Click()
'on définit les variables
Dim User As String  'utilisateur
Dim mdp As String  'mot de passe
Dim cnf As String  'confirmation
Dim Coché As Boolean  'case a coché
Dim Derl As Long    'remplissage de la dernière ligne
Dim Ws As Worksheet  'feuille matrice

Set Ws = Sheets("Administrateur")  'sélection de la feuille Administrateur
Coché = False 'position de départ de la case (décoché)
'on vérifie que l'utilisateur à rempli tous les champs
If Me.TextBox1 = "" Or Me.TextBox2 = "" Or Me.TextBox3 = "" Then
    MsgBox "Veuillez remplir tous les champs"  'message si champ manquant
    Exit Sub 'on ferme la boite de dialogue
End If
User = Me.TextBox1  'on attribut les valeurs aux variables
mdp = Me.TextBox2
cnf = Me.TextBox3
For i = 2 To 18   'on crée une boucle de contrôles
    'on vérifie si au moins une case est coché
    If Me.Controls("CheckBox" & i) = True Then
        Coché = True: Exit For 'j'avais oublié cette bonne idée de Jean Marie
    End If
Next i   'on passe à l'étape suivante

If Coché = False Then  'si condition case coché est fausse, on a une alerte
    MsgBox "Veuillez cochez au moins une feuille"
    Exit Sub 'on ferme la boite de dialogue
End If 'on sort de la condition

'on définit la plage de cellules à remplir en fonction de la derniere ligne
Derl = Ws.Range("A" & Rows.Count).End(xlUp).Row + 1

For Each C In Ws.Range("A2:A" & Derl) 'on créer une boucle de vérification
    If C = User Then  'pour les utilisateur que l'on rajoute
        MsgBox "Ce nom d'utilisateur est déja utilisé, veuillez saisir un autre"
        Exit Sub  'on ferme la boite de dialogue
    End If      'on ferme la condition
Next C

If mdp <> cnf Then 'pour le mot de passe créé
    MsgBox "Les mots de passe ne sont pas identiques"
    Me.TextBox2 = ""   'on vide les textbox
    Me.TextBox3 = ""
    Exit Sub           'on sort du programme
End If

If MsgBox("Voulez vous créer ce compte?", vbYesNo, "Création du compte") = vbYes Then
    With Ws
        .Range("A" & Derl).Value = User
        .Range("B" & Derl).Value = mdp
        For i = 2 To 18
            If Me.Controls("CheckBox" & i) = True Then
                .Cells(Derl, i + 1).Value = "X"
            End If
        Next i
    End With
    MsgBox "Ce compte a été créer avec succés"
    'on libère l'espace mémoire
End If
Set Ws = Nothing
End Sub
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonjour dayyoni
Bonjour le fil ,le Forum
je confirme ce que dit Robert et soan (je n'ai pas ouvert son fichier)
Pourquoi dans "frmconnexion" y'a t'il 3 TextBox (1 à 3) dont un Masqué ?
jean marie
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
quelqu'un pourrait m'expliquer ceci 🤪 🥳
VB:
For i = 1 To 17       'on créer un boucle de controle des checkbox,position de départ "décoché"
   Me.CheckBox2 = False
   Me.CheckBox3 = False
   Me.CheckBox4 = False
   Me.CheckBox5 = False
   Me.CheckBox6 = False
   Me.CheckBox7 = False
   Me.CheckBox8 = False
   Me.CheckBox9 = False
   Me.CheckBox10 = False
   Me.CheckBox11 = False
   Me.CheckBox12 = False
   Me.CheckBox13 = False
   Me.CheckBox14 = False
   Me.CheckBox15 = False
   Me.CheckBox16 = False
   Me.CheckBox17 = False
   Me.CheckBox18 = False
 
Next i
a mon avis c'est sur il seront a false
LOL
Je sais pas j'aurais plutot fait un truc du genre

suprimé pour cause d'invisibilité

RE LOL
;)🥳🤪
 
Dernière édition:

dayyoni

XLDnaute Nouveau
Bonjour dayyoni, le fil,

ton fichier en retour. :)

* maintenant, il n'y a plus aucune erreur de compilation. 😊

* pour les erreurs d'exécution, je n'ai pas testé, à toi
l'honneur d'essayer. 😜

* s'il y a des erreurs de logique dans ton code VBA,
je te laisse le soin de les découvrir.

pour le SAV, je ne suis pas sûr qu'il y en aura. :rolleyes:
je croise les doigts pour que tout soit ok ! :p


soan
Bonjour Soan,
un grand merci pour ton retour, je vais tester et je te ferais à mon tour un retour.
Bien cordialement.
dayyoni.
 

dayyoni

XLDnaute Nouveau
re
bonjour a tous
quelqu'un pourrait m'expliquer ceci 🤪 🥳
VB:
For i = 1 To 17       'on créer un boucle de controle des checkbox,position de départ "décoché"
   Me.CheckBox2 = False
   Me.CheckBox3 = False
   Me.CheckBox4 = False
   Me.CheckBox5 = False
   Me.CheckBox6 = False
   Me.CheckBox7 = False
   Me.CheckBox8 = False
   Me.CheckBox9 = False
   Me.CheckBox10 = False
   Me.CheckBox11 = False
   Me.CheckBox12 = False
   Me.CheckBox13 = False
   Me.CheckBox14 = False
   Me.CheckBox15 = False
   Me.CheckBox16 = False
   Me.CheckBox17 = False
   Me.CheckBox18 = False
 
Next i
a mon avis c'est sur il seront a false
LOL
Je sais pas j'aurais plutot fait un truc du genre
VB:
For i = 2 to 18       'on créer un boucle de controle des checkbox,position de départ "décoché"
   Me.Frame3.controls("CheckBox" & i) = False
next

RE LOL
;)🥳🤪
Deja testé ,ne fonctionne pas, et pour info oui ce code fonctionne parfaitement, juste qu'il est un peu complexe et trop long.
Pour la sécurité il est conseillé de réduire la longueur du code.
Donc je cherche à optimiser mes codes.
Cordialement.
 

ChTi160

XLDnaute Barbatruc
Re
Patrick je faisais un peu d'humour lol

Arff ,tu vas nous le fâcher !
si tu as 17 CheckBox numérotés de 2 à 18
La boucle devrait fonctionner.
Jean marie
Peut être parles tu d' autre chose ?
Car il y a pas mal de chose à modifier.
Ah ! la sécurité .
 

Discussions similaires

Réponses
2
Affichages
52
Réponses
1
Affichages
87
Haut Bas