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...

patricktoulon

XLDnaute Barbatruc
re
Deja testé ,ne fonctionne pas, et pour info oui ce code fonctionne parfaitement, juste qu'il est un peu complexe et trop long.

la on est pas dans de l'optimisation mais dans une carence de connaissance du contexte

ceci doit fonctionner
supprimé pour cause d'invisibilité

@ChTi160
Car il y a pas mal de chose à modifier.
non il faut pas se fâcher c'est de l'humour
 
Dernière édition:

Robert

XLDnaute Barbatruc
Re,

Dayyoni, ça serait sympa que tu répondes à tout le monde... Que tu testes vraiment les propositions qu'on te fait sans dire que ça ne marche pas...

Aussi, il doit y avoir dans ton quartier un magasin d'humour. Comme c'est un produit de première nécessité il sera forcément ouvert et en plus avec le vendredi noir il est en promo. Toi prendre, toi prendre...

Ouais, bonne journée à tous.
 

dayyoni

XLDnaute Nouveau
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
Bonjour Robert,
Je viens de tester le code et mon problème s'est résolu.
Un grand merci à toi et a ton expertise. Tu as tout de suite vu juste.
Bien cordialement,
Bonne journée à toi
Dayyoni,
 

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
salut, en fait je comprend pourquoi tu dis ca ,oui car j'atais en train de modifier l'ensemble de mon fichier et ce que j'ai envoyé ne correspondait plus avec mon fichier de départ,donc petite erreur de fichier mis à dispo.
Mais que je vous rassure mon fichier de départ fonctionne très bien
je voulais juste apprendre et comprendre le fonctionnement de la méthode.
Cordialement
 
Dernière édition:

dayyoni

XLDnaute Nouveau
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
Bonjour jean-marie comme je disais, c'est un fichier que j'étais en train de modifier, mais le fichier de départ fonctionne, je cherchais a utiliser la fonction me control pour raccourcir mon code
Cordialement.
 

dayyoni

XLDnaute Nouveau
Re
Non Patrick ! je te vois lol
dayyoni
Tu aurais dû mettre le fichier Source et demander comment le modifier en fonction de tes attentes
cela aurait peut être était mieux . Enfin !
jean marie
Oui c'est vrai, mais j'étais crevé hier soir, j'ai mis le mauvais fichier.
L'important est que mon problème à été résolu et j'ai appris à utiliser une nouvelle fonction.Ça marche.
Merci à vous
 

dayyoni

XLDnaute Nouveau
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

Effectivement C'est de checkbox 2 a 18 et non de 1 à 17
 

dayyoni

XLDnaute Nouveau
Bonjour Robert
toi prendre toi prendre 😍😍
de ja pour commencer on remplace le activate par ceci
supprimé pour cause d'invisibilité
je n'ai pas corrigé tout les commentaires mais bon
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.
 

Discussions similaires

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