XL 2016 Mémorisation d'une identification d'utilisateur d'un User Form sur une feuille Excel.

Pauuul35

XLDnaute Junior
Bonjour tout le monde,

/!\ Je suis un apprenti sur le monde du VBA /!\

Je souhaite faire un Excel qui regroupe les membres d'une équipe qui par la suite conseillera des formations/documents aux différents utilisateurs et leurs fonctions.
J'ai mis mon nez dans VBA les UserForms depuis peu mais me voilà bloqué.

Lorsque que j'ouvre mon document, j'ai deux choix :
- me connecter
- m'enregistrer

Or, lorsque je souhaite mémoriser les informations de l'utilisateur qui s'enregistre. Cela n'arrive pas à garder sur la feuille que j'ai créée en adéquation.
Savez-vous où est mon problème dans ma situation ?

PS : je vous mets en joint le commencement de ce que j'ai fait.

Tout conseils est la bienvenue !

Merci d'avance
 

Pièces jointes

  • Poste - Formation.xlsm
    38.7 KB · Affichages: 6
Solution
Voir en PJ une version commentée et qui évite tous les formulaire.hide ou .show et ainsi les basculement "intempestifs"..
voir les commentaires pour comprendre la logique

à partir de la feuille, tu as tes deux boutons
le bouton enregistrement permet de saisir un nouvel utilisateur. et c'est tout...==> Inscription et retour sur la feuille
le bouton Connexion:
1) saisie d'un matricule
==> s'il existe==> bouton Demarre dispo
==> s'il n'existe pas==> soit erreur de saisie==> utilisateur modifie sa saisie
==> soit c'est un nouveau matricule ===> le lien est actif pour pouvoir enregistrer
une fois l'enregistrement effectué, retour au formulaire de connexion sur lequel le bouton Demarrer est...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Pauuul, et bienvenu sur XLD,
Il manque pas mal de chose et je n'ai pas tout compris. Mais au moins pour vous dépatouiller :
Validation inscription :
VB:
Private Sub Valider_Click()
    With Sheets("EQUIPE")
        If Application.CountIf(.[C:C], Identifiant) > 0 Then   ' Cas identifiant existe
            MsgBox "L'dentifiant existe"        ' Mettre ici code quand l'identifiant est bon
        Else
            MsgBox "L'dentifiant est inconnu"   ' Mettre ici code quand l'identifiant est incorrect
        End If
        Unload Connexion
    End With
End Sub
Validation inscription :
Code:
Private Sub Valider_Click()
    With Sheets("EQUIPE")
        If Application.CountIf(.[A:A], Nom) > 0 Then   ' Cas du "déjà inscrit"
            MsgBox "Vous êtes déjà inscrit."
            Exit Sub
        End If
        DL = 1 + Range("A65500").End(xlUp).Row          ' Première ligne vide de la liste des noms.
        .Cells(DL, "A") = Nom
        .Cells(DL, "B") = Prenom
        .Cells(DL, "C") = Matricule
        Unload Inscription
    End With
End Sub
C'est évidemment incomplet mais ne génère pas d'erreur et enregistre bien les nouveaux venus.

NB: La mise en commentaire c'est l'apostrophe.
 

Pièces jointes

  • Poste - Formation.xlsm
    38.9 KB · Affichages: 3

Pauuul35

XLDnaute Junior
Bonjour Pauuul, et bienvenu sur XLD,
Il manque pas mal de chose et je n'ai pas tout compris. Mais au moins pour vous dépatouiller :
Validation inscription :
VB:
Private Sub Valider_Click()
    With Sheets("EQUIPE")
        If Application.CountIf(.[C:C], Identifiant) > 0 Then   ' Cas identifiant existe
            MsgBox "L'dentifiant existe"        ' Mettre ici code quand l'identifiant est bon
        Else
            MsgBox "L'dentifiant est inconnu"   ' Mettre ici code quand l'identifiant est incorrect
        End If
        Unload Connexion
    End With
End Sub
Validation inscription :
Code:
Private Sub Valider_Click()
    With Sheets("EQUIPE")
        If Application.CountIf(.[A:A], Nom) > 0 Then   ' Cas du "déjà inscrit"
            MsgBox "Vous êtes déjà inscrit."
            Exit Sub
        End If
        DL = 1 + Range("A65500").End(xlUp).Row          ' Première ligne vide de la liste des noms.
        .Cells(DL, "A") = Nom
        .Cells(DL, "B") = Prenom
        .Cells(DL, "C") = Matricule
        Unload Inscription
    End With
End Sub
C'est évidemment incomplet mais ne génère pas d'erreur et enregistre bien les nouveaux venus.

NB: La mise en commentaire c'est l'apostrophe.
Merci beaucoup !

J'ai commencé a regardé c'est vraiment intéressant, est ce que avec ceci : si jamais la personne s'inscrivant se trompe (faute de frappe, erreur de matricule ou autre) lors de l'inscription ils pourront modifier, ou la ligne aura automatiquement enregistrer et aucuns retours possible ?

NB : Oops je pense que faut je prennes les bases du VBA parce que ça va pas du tout.
 

Pauuul35

XLDnaute Junior
Hello

1er conseil: utiliser les tables structurées (j'en ai créé une: "Tab_Users")
voir code pour son utilisation dans le bouton "Valider"
Bonjour Vgendron !

La méthode avec un tableau me semble plus intéressant de ce que j'avais a l'idée. Merci !

J'ai deux interrogations :

- J'ai regardé ton code, les profils peuvent s'enregistrer a l'infini sans que le code nous bride sur le fait d'être déjà présent dans les registres, comment faire dans le cas ou j'essaye de m'inscrire alors que je suis déjà inscrit ?
Je crois que ce j'ai testé pour vérifier qu'un utilisateur est déjà inscrit, c'est dans une méthode que sans Tableau ...

- Est-ce que c'est possible, une fois inscrit et/ou identifier, de passer en stade de "compte" ? (Je m'explique, une fois enregistré j'aimerai par la suite être garder en mémoire en tant qu'utilisateur connecté et avoir l'accès a mon avancement personnel.)
Je sais pas si j'ai été clair ...

Merci d'avance !

Je te mets l'avancement actuel en joint ou je suis rendu !
 

Pièces jointes

  • Poste - Formation.xlsm
    40.9 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Hello

pour le control d'un matricule déjà existant, tu as bien récupéré la ligne de code de Sylvanu (que je salue au passage également)
je l'ai juste modifié pour faire référence au nom de la colonne "Matricule" plutot que C:C
l'avantage:
1) je trouve qu'on voit tout de suite sur quelle colonne on travaille
2) si tu déplace la colonne dans le tableau.. le code ne change pas. alors que C:C devrait etre adapté

VB:
Private Sub Valider_Click()
    With Sheets("EQUIPE").ListObjects("Tab_Users")
        If Application.CountIf(.ListColumns("Matricule").Range, Matricule) > 0 Then   ' Cas du MATRICULE "déjà inscrit"
            MsgBox "Vous êtes déjà inscrit."
        Else
            .ListRows.Add
            LastLine = .ListRows.Count
            .ListColumns("NOM").DataBodyRange(LastLine) = Me.Nom
            .ListColumns("Prénom").DataBodyRange(LastLine) = Me.Prenom
            .ListColumns("Matricule").DataBodyRange(LastLine) = Me.Matricule
        End If
    End With
End Sub

pour sauvegarder l'utilisateur actif, suffirait d'ajouter une variable globale "ActifUser"
mais. en fait, ca dépend de ce que tu veux faire ensuite

PS: j'ai vu que tu avais remis les "bascules" entre les deux formulaires
à mon avis il te manque une ou des conditions
ex: l'utilsateur veut faire une nouvelle inscription.. si il annule, il se retrouve automatiquemennt sur la connexion.., mais ca. c'est du "facing"
 

Pauuul35

XLDnaute Junior
Hello

pour le control d'un matricule déjà existant, tu as bien récupéré la ligne de code de Sylvanu (que je salue au passage également)
je l'ai juste modifié pour faire référence au nom de la colonne "Matricule" plutot que C:C
l'avantage:
1) je trouve qu'on voit tout de suite sur quelle colonne on travaille
2) si tu déplace la colonne dans le tableau.. le code ne change pas. alors que C:C devrait etre adapté

VB:
Private Sub Valider_Click()
    With Sheets("EQUIPE").ListObjects("Tab_Users")
        If Application.CountIf(.ListColumns("Matricule").Range, Matricule) > 0 Then   ' Cas du MATRICULE "déjà inscrit"
            MsgBox "Vous êtes déjà inscrit."
        Else
            .ListRows.Add
            LastLine = .ListRows.Count
            .ListColumns("NOM").DataBodyRange(LastLine) = Me.Nom
            .ListColumns("Prénom").DataBodyRange(LastLine) = Me.Prenom
            .ListColumns("Matricule").DataBodyRange(LastLine) = Me.Matricule
        End If
    End With
End Sub

pour sauvegarder l'utilisateur actif, suffirait d'ajouter une variable globale "ActifUser"
mais. en fait, ca dépend de ce que tu veux faire ensuite

PS: j'ai vu que tu avais remis les "bascules" entre les deux formulaires
à mon avis il te manque une ou des conditions
ex: l'utilsateur veut faire une nouvelle inscription.. si il annule, il se retrouve automatiquemennt sur la connexion.., mais ca. c'est du "facing"
Oui, je m'inspire de vos conseils a tout les deux pour pouvoir atteindre mon objectif (merci a vous deux).

Je suis tout a fait d'accord la méthode rappelant la colonne matricule plutôt que C:C est plus intéressante. (j'ai apporté cette modification.)

J'ai préféré garder la bascule des deux UserForms, car si jamais l'utilisateur souhaite s'inscrire ou se connecter et se trompe de bouton, il peut directement accéder au bon UF avec les boutons "Pas encore inscrit?" et "Annuler".

Okay! Je vais tester cette après-midi l'histoire du "ActifUser". De plus j'ai essayé de voir en cas d'un profil déjà enregistré, de me connecter mais rien a faire il me considère tout le temps sur "l'identifiant est inconnu" (j'ai repris la méthode de vérification de l'UF "Inscription" pour constater s'il l'utilisateur est déjà inscrit) Sais tu ou est mon erreur ? Ou alors l'erreur vient d'ailleurs ?

VB:
Private Sub Valider_Click()
    With Sheets("EQUIPE").ListObjects("Tab_Users")
    
        If Application.CountIf(.ListColumns("Matricule").Range, Matricule) Then
            MsgBox "L'identifiant existe"        ' Mettre ici code quand l'identifiant est bon
            Connexion.Hide
            Inscription.Hide
        Else
            MsgBox "L'identifiant est inconnu"   ' Mettre ici code quand l'identifiant est incorrect
            Inscription.Show
            Connexion.Hide
        End If
        Unload Connexion
        Unload Inscription
    End With
End Sub
 

vgendron

XLDnaute Barbatruc
Voir en PJ une version commentée et qui évite tous les formulaire.hide ou .show et ainsi les basculement "intempestifs"..
voir les commentaires pour comprendre la logique

à partir de la feuille, tu as tes deux boutons
le bouton enregistrement permet de saisir un nouvel utilisateur. et c'est tout...==> Inscription et retour sur la feuille
le bouton Connexion:
1) saisie d'un matricule
==> s'il existe==> bouton Demarre dispo
==> s'il n'existe pas==> soit erreur de saisie==> utilisateur modifie sa saisie
==> soit c'est un nouveau matricule ===> le lien est actif pour pouvoir enregistrer
une fois l'enregistrement effectué, retour au formulaire de connexion sur lequel le bouton Demarrer est maintenant dispo..
 

Pièces jointes

  • Poste - Formation (1).xlsm
    44.5 KB · Affichages: 3

Pauuul35

XLDnaute Junior
Voir en PJ une version commentée et qui évite tous les formulaire.hide ou .show et ainsi les basculement "intempestifs"..
voir les commentaires pour comprendre la logique

à partir de la feuille, tu as tes deux boutons
le bouton enregistrement permet de saisir un nouvel utilisateur. et c'est tout...==> Inscription et retour sur la feuille
le bouton Connexion:
1) saisie d'un matricule
==> s'il existe==> bouton Demarre dispo
==> s'il n'existe pas==> soit erreur de saisie==> utilisateur modifie sa saisie
==> soit c'est un nouveau matricule ===> le lien est actif pour pouvoir enregistrer
une fois l'enregistrement effectué, retour au formulaire de connexion sur lequel le bouton Demarrer est maintenant dispo..
Merci pour ces commentaires j'ai désormais compris ce que tu m'expliquais ! (Et merci du temps que tu m'accordes pour m'aider à m'améliorer dans le domaine !)

Concernant l'UserActif que tu as mis en place y'a t-il une solution visuelle qui permet de savoir : Qui est Actif en temps réel ? par exemple avec le prénom et le nom de l'utilisateur qu'on récupère dans nos registres enregistrés ?
Imaginons que la case est vide dans l'Excel : ...
1671112046097.png

... puis après connexion :
1671112109131.png
 

Pauuul35

XLDnaute Junior
il suffit de mettre l'info dans la feuille
Merci encore ! J'ai apporté les modifications pour ne faire qu'apparaitre que le prénom et le nom de l'utilisateur actif.

Lors de l' "Inscription" cela marche comme je le souhaite. MAIS :
J'ai remarqué que durant l'exécution du programme de "Connexion", lors de la demande d'affichage d'un utilisateur il me renvoi automatiquement sur la feuille "Equipe". Comment je peux éviter se renvoi à la feuille "Equipe" tout en exécutant le programme ? (J'ai essayé avec la formule Application.ScreenUpdating = False/True pour notamment caché mais cela ne fonctionne pas)

PS : Je ne sais pas si ce que j'ai fait est extrêmement efficace, mais ca marche donc je suis content ! :)
PS 2 : Je te remercie encore pour l'aide que tu m'apportes

Prochaine mission : Grâce au bouton "Choisir son service et son poste" renvoyer des fenêtres de choix afin de catégoriser l'utilisateur dans un service et dans un métier spécifique, qui par la suite lui demandera de faire les formations/immersions/lecture de documents correspondant a sa fonction !! :D
As/avez-tu/vous des conseils avant que je me lance la dedans ?
 

Pièces jointes

  • Poste - Formation.xlsm
    52.1 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Bonjour

pour ne pas basculer sur la feuille Equipe;. il suffit de ne pas l'activer quand tu fais ta recherche de matricule pour récupérer nom et prénom
et autre, chose: pourquoi persistes tu à remettre systématiquement les formulaire.hide ??
cacher un formulaire qui n'a pas été affiché. c'est quoi l'intérêt?? à part s'exposer à un bug ?

pour le bouton de service: définis ton formulaire avec des combobox alimentés par des listes

et pour la suite... une fois que tu auras choisi le service et poste. tu feras autre chose??
 

Pièces jointes

  • Poste - Formation (2).xlsm
    49 KB · Affichages: 4

Pauuul35

XLDnaute Junior
Bonjour

pour ne pas basculer sur la feuille Equipe;. il suffit de ne pas l'activer quand tu fais ta recherche de matricule pour récupérer nom et prénom
et autre, chose: pourquoi persistes tu à remettre systématiquement les formulaire.hide ??
cacher un formulaire qui n'a pas été affiché. c'est quoi l'intérêt?? à part s'exposer à un bug ?

pour le bouton de service: définis ton formulaire avec des combobox alimentés par des listes

et pour la suite... une fois que tu auras choisi le service et poste. tu feras autre chose??
Concernant l'utilisation du .Hide, j'avais complétement oublié d'apporter les modifications que tu m'avais conseillé !

Je prends note du ComboBox ! Les listes je les fais en amont dans un Excel (avec des liens potentiels etc...) ?

Mon objectif serai une fois l'utilisateur lié a son service et son poste, d'avoir le cheminement de sa formation (qu'il pourra cocher, comme une sorte de "To Do List", au fur et a mesure) afin qu'il se soit apte, a la fin du processus, a faire correctement son travail. Ainsi a l'aide d'une barre de progression de sa formation il pourra voir facilement son avancement.
Chaque utilisateur aura sa propre progression différente.
Tu aurai des commentaires la dessus, tu trouves que c'est une bonne idée ?
 

vgendron

XLDnaute Barbatruc
avant de te lancer dans du codage vba, il faut que tu définisses correctement le projet
1) utiliser des tables structurées pour préparer les listes
2) créer une Base de données qui regroupe tous les utilisateurs avec toutes les formations possibles à réaliser
3) créer un "modèle" de présentation que chaque utilisateur pourra visualiser avec ses informations.

ensuite, le code ne sera la que pour saisir / extraire des informations
 

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa