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 définit les variables...

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Tu devrais etre un peu plus humble car la connaissance s'acquiert avec le temps, la pertinence mais aussi des personnes à l'écoute tout simplement.Tout ce que tu sais c'est parce-que d'autres aussi ont bien voulu te l'apprendre et de manière totalement gratuite et transparente = partages des connaissance = internet
à mon entendeur qui sait tout par lui même.
Merci.
Ne le prend pas mal Dayyoni, c'est l'humour de Patrick. J'ai eu du mal moi aussi au début puis j'ai vite compris qu'il n'y avait que de l'envie d'aider dans ses démarches avec parfois, c'est vrai, un peu de foutage de gueule. Mais, piquer un peu les gens n'est pas toujours une mauvaise chose...
Sinon tu as parfaitement raison, on a tous été débutant et on doit beaucoup à ceux qui nous ont aidé.
 

patricktoulon

XLDnaute Barbatruc
re
ben quand tu as réponse avec un un code propre prêt a l'emploi et que tu zappe
par ce que tu n'a pas d'humour et dieu sait qu'il en faut en ce moment
ben les réponses je les supprime
tu a clairement montré un dédain pour mes interventions
je n'y vois aucun inconvénients c'est toi qui vois ( le perdant c'est toi)
ben voilà reste avec ton code qui n'a ni queue ni sens puisque tu l'a dit toi même ça fonctionne et continue a coder a la pelle et à la pioche en traînant un tractopelle
et surtout pour la leçon d'humilité je pense que tu devrais suivre tes propres conseils
je te laisse là avec ton super code
bonne journée
a mon entendeur qui en pige pas une miette et qui ne me vois pas
LOL
 

dayyoni

XLDnaute Nouveau
Re,


Ne le prend pas mal Dayyoni, c'est l'humour de Patrick. J'ai eu du mal moi aussi au début puis j'ai vite compris qu'il n'y avait que de l'envie d'aider dans ses démarches avec parfois, c'est vrai, un peu de foutage de gueule. Mais, piquer un peu les gens n'est pas toujours une mauvaise chose...
Sinon tu as parfaitement raison, on a tous été débutant et on doit beaucoup à ceux qui nous ont aidé.
Oui tu as tout a fait raison et je ne lui en veux aucunement.
Merci à Patrick pour sa réactivité !
 

dayyoni

XLDnaute Nouveau
re
ben quand tu as réponse avec un un code propre prêt a l'emploi et que tu zappe
par ce que tu n'a pas d'humour et dieu sait qu'il en faut en ce moment
ben les réponses je les supprime
tu a clairement montré un dédain pour mes interventions
je n'y vois aucun inconvénients c'est toi qui vois ( le perdant c'est toi)
ben voilà reste avec ton code qui n'a ni queue ni sens puisque tu l'a dit toi même ça fonctionne et continue a coder a la pelle et à la pioche en traînant un tractopelle
et surtout pour la leçon d'humilité je pense que tu devrais suivre tes propres conseils
je te laisse là avec ton super code
bonne journée
a mon entendeur qui en pige pas une miette et qui ne me vois pas
LOL
je t'ai répondu, tu te vexes lorsque tu sais que tes réactions sont blessantes
mais bon!
merci a toi , on a toujours besoin l'un de l'autre dans ce milieu qui est vaste.
Tu vois ce que je veux dire.
 

patricktoulon

XLDnaute Barbatruc
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 définit les variables
        Dim Ws As Worksheet, Lr&
        Set Ws = Sheets("Administrateur")    'instantiation de la variable  feuille WS
        Lr = Ws.Range("A" & Rows.Count).End(xlUp).Row    'determine la variable Lr(last row) avec la derniere ligne la feuille Ws
        If Lr > 1 Then ComboBox1.List = Ws.Range("A2:A" & Lr).Value   'si Lr>1 alors alimenter combo
        Set Ws = Nothing    'on detruit la fonction,permet de liberer l'espace mémoire
    End Sub
fait ca et reviens
 

patricktoulon

XLDnaute Barbatruc
ensuite
pour le change de la combo
soyons logique
tu la rempli avec la colonne A
donc comme le premier item dans une combobox est l'index 0
si tu selectionne un item dans la combo il correspondra a comboboxX.listindex +2
puisque ta liste commence en 2d ligne dans ta feuille
parti de là
on va pas boucler tractoppeller, labourrer, piocher
on index simplement +2
conclusion ton change de combobox
tu remplace ceci
VB:
Private Sub ComboBox1_Change()
Dim Ws As Worksheet
Dim User As String
Dim Lr As Long

Set Ws = Sheets("Administrateur") 'on selectionne la feuille WS
User = Me.ComboBox1  'on attribut la combobox1 à la variable User

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

With Ws
 Lr = .Range("A" & Rows.Count).End(xlUp).Row 'afficher l'utilisateur et son mot de passe
    For Each C In .Range("A2:A" & Lr) 'on crée un boucle de balayage afin de retrouver les utilisateur qui se trouvent dans la combobox
      If User = C Then 'on pose la condition pour le remplissage des textbox
         Me.TextBox1 = C 'on attribut la textebox1 a la variable C "user"
         Me.TextBox2 = C.Offset(, 1) 'on décale d'une colonne
         Me.TextBox3 = C.Offset(, 1)
      
      'on crée une boucle pour voir en fonction des cases des feuilles cochés et en fonction de l'utilisateur sèlectionné

         For i = 1 To 17
           If C.Offset(, i + 1) = "x" Then
              Me.CheckBox2 = True
              Me.CheckBox3 = True
              Me.CheckBox4 = True
              Me.CheckBox5 = True
              Me.CheckBox6 = True
              Me.CheckBox7 = True
              Me.CheckBox8 = True
              Me.CheckBox9 = True
              Me.CheckBox10 = True
              Me.CheckBox11 = True
              Me.CheckBox12 = True
              Me.CheckBox13 = True
              Me.CheckBox14 = True
              Me.CheckBox15 = True
              Me.CheckBox16 = True
              Me.CheckBox17 = True
              Me.CheckBox18 = True
            End If  'on sort de la condition
          Next i  'on passe à létape suivante
          Exit For 'on sort de la boucle
        End If 'on ferme la condition
      Next 'on passe à létape suivante
End With  'on ferme la fonction

'on établie une fonction qui bloque le bouton créer un compte
Me.CdtCreerUnCompte.Enabled = False

'on active le bouton ModifierUnCompte (aller ds propriété du bloc,mettre sur position "false",
'permet de griser le bloc lorque l'on lance une recherche
Me.CbtnModifierUncompte.Enabled = True

Set Ws = Nothing 'on libère la mémoire
End Sub
par cela
VB:
Private Sub ComboBox1_Change()
    Dim Ws As Worksheet, User$, Lr&

    Set Ws = Sheets("Administrateur")    'on selectionne la feuille WS
    
    'on créer un boucle de controle des checkbox,position de départ "décoché"
    For i = 2 To 18: Me.Frame3.Controls("CheckBox" & i) = False: Next
    Set C = Ws.Cells(ComboBox1.ListIndex + 2, 1)
        Me.TextBox1 = C    'user"
        Me.TextBox2 = C.Offset(, 1)    'mot de passe
        Me.TextBox3 = C.Offset(, 1)    'confirmation mot de passe

        For i = 2 To 18
            Me.Frame3.Controls("CheckBox" & i).Value = C.Offset(, i) = "X"
        Next i  'on passe à létape suivante

    
    Me.CdtCreerUnCompte.Enabled = False    'on bloque bouton creation
    Me.CbtnModifierUncompte.Enabled = True    'on active le bouton ModifierUnCompte
    Set Ws = Nothing    'on libère la mémoire
End Sub
c'est bon tu suis 😂 🤪
 

dayyoni

XLDnaute Nouveau
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 définit les variables
        Dim Ws As Worksheet, Lr&
        Set Ws = Sheets("Administrateur")    'instantiation de la variable  feuille WS
        Lr = Ws.Range("A" & Rows.Count).End(xlUp).Row    'determine la variable Lr(last row) avec la derniere ligne la feuille Ws
        If Lr > 1 Then ComboBox1.List = Ws.Range("A2:A" & Lr).Value   'si Lr>1 alors alimenter combo
        Set Ws = Nothing    'on detruit la fonction,permet de liberer l'espace mémoire
    End Sub
fait ca et reviens
hello Patrick, ok ca marche je teste tout cela et je reviens
Merci à toi
 

patricktoulon

XLDnaute Barbatruc
voila maintenant essaie d'appliquer cette philosophie a tout le reste de ce userform
prend ton temps réfléchi
je regarderais dans le courant de l’après midi je vais partir en inter chez client donc je vais m'absenter vers les 14 heures
et le tractopelle laisse le au garage
LOL
 

soan

XLDnaute Barbatruc
Inactif
@dayyoni, le fil,

dans le fichier de mon post #7 as-tu remarqué que j'ai renommé toutes
tes CheckBox 2 à 18 en CheckBox 1 à 17 ? et j'ai mis plusieurs boucles
avec 1 à 17 en plus de celles que tu avais déjà mises.

tu avais utilisé une variable de nom Workbook mais il ne faut pas le faire
car c'est un mot-clé réservé du VBA ; j'ai remplacé Workbook par Wbk
et mis : Dim Wbk As Workbook

tu avais utilisé une variable de nom Shape mais il ne faut pas le faire
car c'est un mot-clé du VBA ; j'ai remplacé Shape par Sh et mis :
Dim Sh As Shape

j'espère que tu as fait toutes ces modifs dans ton vrai fichier. ;)
mais prends en priorité les infos que @patricktoulon est en
train de te donner en ce moment.

pour les nombreuses erreurs de compilation que j'ai corrigées,
c'était finalement inutile puisque ce n'était pas le bon fichier,
mais l'essentiel est que ton vrai fichier marche bien.


soan
 

soan

XLDnaute Barbatruc
Inactif
Patrick,

j'ai nommé de 1 à 17 car il y a 17 CheckBox ; et ce, uniquement dans le UserForm,
par rapport au UserForm ; je ne comprends pas pourquoi tu veux nommer par
rapport aux lignes de la feuille de calcul ; si y'a un intérêt à ça, je vois pas lequel !


soan
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof