[RESOLU]procédure conditionnelle et rendre focus au controle

cathodique

XLDnaute Barbatruc
Je trouve quelques difficultés à mettre en place des procédures conditionnelles dans un formulaire.

Celui-ci me permettra d'ajouter des utilisateurs avec des droits d'accès. à l'ouverture du formulaire, le focus est mis sur Textbox1 (où l'on doit saisir l'utilisateur)

dans Textbox2 il y a un pass utilisateur générique ('0000) , dans combobox1 on sélectionne le niveau (1 à 4) suivant lequelle en textbox3 s'affiche un intitulé.

et 2 boutons (Ajouter et quitter).

Je voudrais donc dans la procédure du bouton valider faire ce qui suit:

a/ Si Textbox1=vide et Combobox1=vide, on sort de la procédure (sans fermeture du formulaire) et remettre le focus sur textbox1

b/ si textbox1<>vide et combobox1=vide, on sort de la procédure (sans fermeture du formulaire) et remettre le focus sur Combobox1

c/ si textbox1<>vide et combobox1<>vide, on vérifie en feuille(users) colonne 1 que l'utilisateur n'est pas enregistré, dans ce cas on transfert sur la feuille

Mais s'il est déjà présent, textbox1 et combobox1 sont vidés et message prévient que l'utilisateur existe.

En vous remerciant, J'ai fait quelque chose mais la première des difficultés est de rendre le focus au textbox1
VB:
Private Sub Btn_Valider_Click()
    Dim LastLg As Long
    'verifier textbox1 et combobox1 vide
     If Me.TextBox1 = "" And Me.ComboBox1 = "" Then
     MsgBox "Aucune Action! Veuillez saisir un nom.", vbCritical, "CHAMPS VIDES"
     Exit Sub
    Me.TextBox1.SetFocus
     ElseIf Me.TextBox1.Text = "" Then
        MsgBox "Veuillez saisir le nom de l'utilisateur!", vbCritical, "UTILISATEUR"
        Exit Sub
        Me.TextBox1.SetFocus
        ElseIf ComboBox1.Text = "" Then
        MsgBox "Veuillez selectionner le niveau d'accès de l'utilisateur!", vbCritical, "NIVEAU ACCES"
        Exit Sub
        ComboBox1.SetFocus
    End If
        'on enregistre

        'Dim LastLg As long
        Dim X As String

        With Sheets("Users")
            'trouver derniere ligne vide
            LastLg = .Columns(1).Find("").Row

            'on verifie que l'utilisateur n'existe pas
            X = Usf_Ajout_Utilisateur.TextBox1    '.Text

            Set C = .Columns(1).Cells.Find(X)
            If Not C Is Nothing Then
                MsgBox "Cet utilisateur existe déjà!", vbCritical
                Unload Usf_Ajout_Utilisateur
                ' Exit Sub

            Else
                'on enregistre sur la feuille
                .Cells(LastLg, 1) = UCase(Usf_Ajout_Utilisateur.TextBox1.Text)
                .Cells(LastLg, 2) = Usf_Ajout_Utilisateur.TextBox2.Text
                .Cells(LastLg, 3) = Usf_Ajout_Utilisateur.ComboBox1.Text
                .Cells(LastLg, 4) = Usf_Ajout_Utilisateur.TextBox3.Text

            End If
        End With

    MsgBox "Enregistrement terminé!", vbExclamation

    Unload Me
End Sub
 

Pièces jointes

  • Ajout_User.xls
    52 KB · Affichages: 29
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : procédure conditionnelle et rendre focus aux controles

Merci, je pense que je me suis sorti d'affaire. Voici le code
VB:
Private Sub Btn_Valider_Click()
    Dim LastLg As Long, X As String
    'verifier textbox1 et combobox1 vide
suite:
     If Me.TextBox1 = "" And Me.ComboBox1 = "" Then
     MsgBox "Aucune Action! Veuillez saisir un nom.", vbCritical, "CHAMPS VIDES"
     Me.TextBox1.SetFocus
     Exit Sub
    
     ElseIf Me.TextBox1.Text = "" Then
        MsgBox "Veuillez saisir le nom de l'utilisateur!", vbCritical, "UTILISATEUR"
        Me.TextBox1.SetFocus
        Exit Sub
        
        ElseIf ComboBox1.Text = "" Then
        MsgBox "Veuillez selectionner le niveau d'accès de l'utilisateur!", vbCritical, "NIVEAU ACCES"
        Me.ComboBox1.SetFocus
        Exit Sub
        
    End If
        'on enregistre

        With Sheets("Users")
            'trouver derniere ligne vide
            LastLg = .Columns(1).Find("").Row

            'on verifie que l'utilisateur n'existe pas
            X = Me.TextBox1    '.Text

            Set C = .Columns(1).Cells.Find(X)
            If Not C Is Nothing Then
                MsgBox "Cet utilisateur existe déjà!", vbCritical
                Me.TextBox1 = "": ComboBox1 = ""
                Me.TextBox1.SetFocus
                 Exit Sub
GoTo suite
            Else
                'on enregistre sur la feuille
                .Cells(LastLg, 1) = UCase(Me.TextBox1.Text)
                .Cells(LastLg, 2) = Me.TextBox2.Text
                .Cells(LastLg, 3) = Me.ComboBox1.Text
                .Cells(LastLg, 4) = Me.TextBox3.Text

            End If
        End With

    MsgBox "Enregistrement terminé!", vbExclamation

    Unload Me
End Sub
 

cathodique

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

Bonsoir Papou-net,

C'est très sympa de ta part. Je trouve ton code plus court que le mien et surtout plus concis.

J'ai appris le dropdown de la combobox.

Toute la première partie est bonne, sauf la partie enregistrement, la vérification du nom de l'utilisateur n'est pas efficace.

c'est à dire, on peut enregistrer un utilisateur en doublon dans le cas où la saisie s'effectue en minuscule.

Dans de code d'enregistrement sur la feuille, le nom est en majuscule (Ucase(textbox1)).

un utilisateur ne peut pas avoir 2 niveaux d'accès différents.


Merci beaucoup. Bonne soirée et bon week-end.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

Encore merci, j'ai apporté quelques modifications et je pense que c'est bon. voilà, j'édite le code pour avoir ton avis
VB:
Private Sub Btn_Valider_Click()
    Dim LastLg As Long
    Dim Nom As Range, Lg As Long
    'verifier textbox1 et combobox1 vide
    If Me.TextBox1 = "" Then
      MsgBox "Aucune Action! Veuillez saisir un nom.", vbCritical, "CHAMPS VIDES"
      Me.TextBox1.SetFocus
      Exit Sub
    End If
    If Me.ComboBox1.ListIndex = -1 Then
      MsgBox "Veuillez selectionner le niveau d'accès de l'utilisateur!", vbCritical, "UTILISATEUR"
      Me.ComboBox1.DropDown
      Exit Sub
    End If
    
    With Feuil1
      Set Nom = .Columns(1).Find(TextBox1, LookIn:=xlValues, lookat:=xlWhole)
      If Not Nom Is Nothing Then
        Lg = Nom.Row
        If UCase(TextBox1) = Nom Then 'And ComboBox1 = CStr(Nom.Offset(0, 2)) Then
          MsgBox "Utilisateur déjà enregistré!", vbCritical, "UTILISATEUR"
          TextBox1 = "": ComboBox1.ListIndex = -1: TextBox3 = ""
          TextBox1.SetFocus
          Exit Sub
        End If
      End If
      'trouver derniere ligne vide
      LastLg = .Columns(1).Find("").Row
      .Cells(LastLg, 1) = UCase(Usf_Ajout_Utilisateur.TextBox1.Text)
      .Cells(LastLg, 2) = Usf_Ajout_Utilisateur.TextBox2.Text
      .Cells(LastLg, 3) = Usf_Ajout_Utilisateur.ComboBox1.Text
      .Cells(LastLg, 4) = Usf_Ajout_Utilisateur.TextBox3.Text
    End With

    MsgBox "Enregistrement terminé!", vbExclamation

    Unload Me
End Sub
 

Papou-net

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

RE:

Toute la première partie est bonne, sauf la partie enregistrement, la vérification du nom de l'utilisateur n'est pas efficace./QUOTE]
Il est effectivement possible d'enregistrer le même nom, mais uniquement si le droit utilisateur est différent.

En effet, rien n'empêche d'avoir deux personnes du même nom (membres d'une même famille). J'avais donc ajouté la comparaison avec les droits d'utilisateur mais je m'aperçois que là encore il peut y avoir deux homonymes au même poste. Il faudrait alors vérifier également que le mot de passe soit différent. Je te propose donc de corriger comme ceci:

Code:
Private Sub Btn_Valider_Click()
    Dim LastLg As Long
    Dim Cel As Range, Nom As Range, Lg As Long
    'verifier textbox1 et combobox1 vide
    If Me.TextBox1 = "" Then
      MsgBox "Aucune Action! Veuillez saisir un nom.", vbCritical, "CHAMPS VIDES"
      Me.TextBox1.SetFocus
      Exit Sub
    End If
    If Me.ComboBox1.ListIndex = -1 Then
      MsgBox "Veuillez selectionner le niveau d'accès de l'utilisateur!", vbCritical, "UTILISATEUR"
      Me.ComboBox1.DropDown
      Exit Sub
    End If
    
    With Feuil1
      Set Nom = .Columns(1).Find(UCase(TextBox1), LookIn:=xlValues, lookat:=xlWhole)
      If Not Nom Is Nothing Then
        For Each Cel In Range("A" & Nom.Row & ":A" & Rows.Count).SpecialCells(xlCellTypeConstants)
          Lg = Cel.Row
          If UCase(TextBox1) = Cel And ComboBox1 = CStr(Cel.Offset(0, 2)) And TextBox2 = Cel.Offset(0, 1) Then
            MsgBox "Utilisateur déjà enregistré!", vbCritical, "UTILISATEUR"
            TextBox1 = "": ComboBox1.ListIndex = -1
            TextBox1.SetFocus
            Exit Sub
          End If
        Next
      End If
      'trouver derniere ligne vide
      LastLg = .Columns(1).Find("").Row
      .Cells(LastLg, 1) = UCase(TextBox1.Text)
      .Cells(LastLg, 2) = CStr(TextBox2.Text)
      .Cells(LastLg, 3) = ComboBox1.Text
      .Cells(LastLg, 4) = TextBox3.Text
    End With
    MsgBox "Enregistrement terminé!", vbExclamation
    Unload Me
End Sub
Il devient dès lors possible d'avoir deux noms identiques (époux, frères-soeurs...) au même poste mais à condition d'avoir des mots de passe distincts.

Par contre, ton idée de rajouter Ucase est judicieuse.

Bonne soirée et bon WE.

Cordialement.
 

Pièces jointes

  • Copie 01 de Ajout_User.xls
    43 KB · Affichages: 15

cathodique

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

Bonjour Papou-net,

Je te remercie beaucoup pour ta dernière proposition. En fait, je ne suis pas arrivé au partage et au travail à plusieurs sur le même fichier.

Pour les utilisateurs, je me suis mal exprimé c'est plutôt PSEUDO que NOM.

J'ai testé ton dernier fichier joint, on peut toujours enregistrer utilisateur avec même pseudo et même password.

Encore merci et bon week-end.
 

Pièces jointes

  • Copie 01 de Ajout_User_testée.xls
    51 KB · Affichages: 19

Papou-net

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

Bonjour cathodique,

Alors effectivement, s'il s'agit de pseudo, il ne peut y en avoir deux identiques. Dans ce cas, ta solution #5 convient parfaitement, d'autant qu'elle est plus simple.

Bon WE.

Cordialement.
 

cathodique

XLDnaute Barbatruc
Re : [RESOLU]procédure conditionnelle et rendre focus au controle

Merci beaucoup pour ton retour. OK, c'est ce que je vais prendre comme solution.

Je dois réaliser l'UserForm d'accès, dans lequel je dois donner la possibilité à l'utilisateur de modifier son mot de passe.

Bon week-end. A la prochaine.

Cordialement,
 

Discussions similaires

Réponses
5
Affichages
1 K
Réponses
10
Affichages
678

Statistiques des forums

Discussions
312 336
Messages
2 087 388
Membres
103 534
dernier inscrit
Kalamymustapha