Prog vba pour excel code pour plusieur pers

Résolu
Bonjour,
je veut crée une useforme avec 6 optionbouton qui prepesente des personnes.
il y a aussi une textbox pour que l'ont tape un code qui ce trouve dans des cellules de la feuill1.
chaque personne a donc un code different donc 6 cellules dans la feuill1.
donc mon prog commence comme ca:
dim code as string
dim nomutilisateur as string
dim code1 as string
dim code2 as string
dim code3 as string
dim code4 as string
dim code5 as string
dim code6 as string
private sub initializeuseform1()
code = textbox1.value
code1 = sheets ("feuil1").range("b2").value
code2 = sheets ("feuil1").range("b3").value
code3 = sheets ("feuil1").range("b4").value
code4 = sheets ("feuil1").range("b5").value
code5 = sheets ("feuil1").range("b6").value
code6 = sheets ("feuil1").range("b7").value
if textbox1.value ="" then
msgbox ("Entrez votre code en minuscule s.v.p")
end if

if optionbotton1.value = true then
nomutilisateur = "personne1"
end if

if optionbotton2.value = true then
nomutilisateur = "personne2"
end if
etc......
j'ais mis une variable qui est nomutilisateur pour pouvoir utiliser la valeur de cette valiable dans dautre useforme.

voici ma question j'ais utiliser un prog du type if/then pour dire que si

if nomutilisateur = "personne1" then code<>code1 msgbox("Code invalide") cela ne fonctionne pas donc je me demande si je ne doit pas utiliser une prosedure du type select case?
si oui comment faire?

comment rendre la valeur de la variable nomutilisateur utilisable dans les autres useforme?
merci a tous...
Configuration: Windows XP
Internet Explorer 6.0

11 réponses

Résumé de la discussion

Création d'une interface useform comportant 6 boutons d'option et une textbox destinée à saisir un code, stocké dans des cellules spécifiques de la feuille feuil1, afin de valider l'identité utilisateur. Plusieurs tests et choix conditionnels lient nomutilisateur et un code individuel (code1 à code6) depuis feuil1, avec des difficultés à partager nomutilisateur entre plusieurs forms. La difficulté principale vient de l'initialisation prématurée de code avant la saisie dans textbox; les propositions recommandent d'initialiser au clic ou d'utiliser Select Case pour tester les combinaisons. En pratique, le partage des valeurs entre forms requiert une portée adaptée et une gestion des événements pour éviter les sorties qui empêchent l'évaluation correcte des codes.

Bobot (l’IA à votre service)
  1. Contributeur
    La réponse est simple, pas moyen de décompilé un EXE.
    Possibilité de voir le code avec un éditeur C, mais de là à le modifier !! ou encore en assembleur mais idem.
    1. coucou
      quand tu dit un editeur c tu veut dire un editeur c++ ou un edit exadecimal ?
      meme question quand tu dit assembleur leque?
      donne moi des nom s.v.p pour exemple.
      merci.
      a +
  2. Contributeur
    Si le test est faut c'est que tu a un espace qui traine quelque part...
    remplace la ligne par

    If UCase(Trim(NomUtilisateur)) = UCase(Trim(NomUtil(i))) Then

    Et si c'est toujours faux, voir ce qu'il y a dans les variables..
    Ou tu a peut-être changer des lignes de code. J'ai controllé sur le classeur et ça fonctionne comme je dit.

    EDIT:Si tu modifie du code (même une seule lettre) toutes les variables sont réinitialisée à... null
    Faut donc recommencer la saisie.
    Pour éviter de fermer et réouvrir, tu ouvre la fenêtre ThysWorkbook et tu fais F5 dans la macro,
    1. merci

      dit moi ! sais tu comment decompiler un fichier *.exe pour pouvoir lire sont ses ligne de prog.

      si ou avec quel logiciel ?

      j'ai entendu parler qu 'il faudrait un editeur exadecimal pour le faire, il doit y avoir mieux, et quelle connaissance doit tu avoir(quel language?)

      merci
      a+
  3. Contributeur
    1°) quand tu ne connais pas un mot de la syntaxe... tu double clic dessus (pour qu'il soit en surbrillance) et tu tape F1, en principe tu recoit l'aide et les explications sur ce mot.

    Private Sub CommandButton2_Click()
    'Bouton annuler
        'enlever le Rem pour rendre opérationnel (je ne vois pas les rem devant les lignes de com, ou sont elles?)
        'ActiveWorkbook.Close ' Rem ou l'apostrohe c'est la même chose,
        'donc tu enlève l'apostrohe de cette ligne
        
        'et enlever unload
        Unload Me 'et içi, mettre l'apostrohe devant mais à ne faire que
        'quand tu a terminé totalement ton appli, sinon le classeur
        'va chaque fois se fermer si ont appuye sur le Bt Annuler,
        'ce qui, en principe doit arriver dans l'emploi normal.
    End Sub


    NomUtilisateur = ListBox1.List(ListBox1.Listindex) (pourquoi pas" NomUtilisateur = ListBox1.Listindex" directement?)
    Parce que listindex renvoi le N° de la ligne sélectionné (à partir de 0) et List renvoi le contenu de la ligne. (F1 oublie pas)

    ReDim Preserve Code(i) (ReDim Preserve="rem variable code(i) stocker?) mettre ReDim en surbrillance et F1

    TextBox1.SetFocus ( quelle action cela fait?) mettre SetFocus en surbrillance et F1

    'Ucase pour ne pas faire de diff entre maju et minuscule (cela ne fonctionne pas)
    If UCase(NomUtilisateur) = UCase(NomUtil(i)) Then '
    Cela fonctionne mais juste dans le test d'égalité, ne change rien aux variables
    Ex: NomUtilisateur = "PIERRE" et NomUtil(i) = "Pierre" les test serrait faux mais avec UCASE ça fait
    Ucase(NomUtilisateur) = "PIERRE" et Ucase(NomUtil(i)) = "PIERRE" alors le test est OK

    MsgBox "Votre code est incorrect", _
    vbCritical=Icône rouge+Croix, "Le Titre de la fenêtre message tu met ce que tu veux" (peut tu me la traduire je ne comprend pas)

    Tout ce qui est en gras, faut pas étudier faut juste savoir que ça existe, ce sont des API de Windows.
    Et oui, tout ça pour JUSTE enlever la croix, mais ça oblige l'utilisateur à entrer le code ou de cliquer sur le bouton annuler.
    1. salut lermite222

      j'ai apppris que quand tu ne connais pas un mot de la syntaxe... tu double clic dessus (pour qu'il soit en surbrillance) et tu tape F1, en principe tu recoit l'aide et les explications sur ce mot.

      merci pour le partage de ton savoir sur vba,j'espere pouvoir faire de même un jours.
      a+
    2. salut lermite..

      'Ucase pour ne pas faire de diff entre maju et minuscule (cela ne fonctionne pas)
      If UCase(NomUtilisateur) = UCase(NomUtil(i)) Then '
      Cela fonctionne mais juste dans le test d'égalité, ne change rien aux variables ( ok mais )
      Ex: NomUtilisateur = "PIERRE" et NomUtil(i) = "Pierre"
      Ucase(NomUtilisateur) = "PIERRE" et Ucase(NomUtil(i)) = "PIERRE" alors le test est faux quand même.

      ou est l'erreur?

      merci
      a+
  4. Contributeur
    if nomutilisateur = "personne1" and code = code1 then ... Si c'est Personne2 qui est sélectionner arriverra jamais..
    Si tu enlève les Exit Sub, et que tu choisi Personne6, va dire 5 fois Code invalide..
    Il faut d'abord tester les Personnes...
        If nomutilisateur = "personne1" Then
        'Et içi, tester le code
            If code = code1 Then
                'le code est bon
            Else
                'le code est pas bon
            End If
        ElseIf nomutilisateur = "personne2" Then
        'Et içi, tester le code
            If code = code2 Then
                'le code est bon
            Else
                'le code est pas bon
            End If
        ElseIf nomutilisateur = "personne3" Then
        'Et içi, tester le code
            If code = code3 Then
                'le code est bon
            Else
                'le code est pas bon
            End If
        End If
        'etc.

    Mais ce n'est pas la bonne façon pour faire ça, inspire toi plutôt du code dans le classeur que je t'ai passé...
    1. bonjour Lermite222

      Comme la dit je m'inspire de ton prog, mais je suis un peut perdu par certainne ligne de prog.

      Private Sub CommandButton2_Click()
      'Bouton annuler
      'enlever le Rem pour rendre opérationnel (je ne vois pas les rem devant les lignes de com, ou sont elles?)
      'ActiveWorkbook.Close
      'et enlever unload
      Unload Me (cela fait tout ce que tu me dit? "arrête de lire" cela vide aussi toute les variables?)
      End Sub

      Private Sub ListBox1_Click()
      'En déclarant NomUtilisateur dans un module, tu peu le 'voir' de
      'partout dans le classeur, aussi dans d'autre UF.
      NomUtilisateur = ListBox1.List(ListBox1.Listindex) (pourquoi pas" NomUtilisateur = ListBox1.Listindex" directement?)
      TextBox1.SetFocus ( quelle action cela fait?)
      End Sub

      Private Sub TextBox1_Change()
      Cmdvalider.Enabled = True
      End Sub

      Private Sub UserForm_Initialize()

      Dim hwnd As Long

      Dim i As Integer

      'Enlever la croix de l'userForme pour empêchè l'utilisateur d'annuler
      hwnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", "X", "D") & "Frame", Me.Caption)
      SetWindowLongA hwnd, -16, GetWindowLongA(hwnd, -16) And &HFFF7FFFF


      (tous ce qui est en gras je le comprend pas mes je le re-examinerais avec le bouquin.)
      i = 1

      With Sheets("Code")
      While .Cells(i, 1) <> ""
      ReDim Preserve Code(i) (ReDim Preserve="rem variable code(i) stocker?)
      ReDim Preserve NomUtil(i)
      Code(i) = .Cells(i, 1)
      NomUtil(i) = .Cells(i, 2)
      ListBox1.AddItem .Cells(i, 2)
      i = i + 1
      Wend
      End With
      End Sub

      Private Sub Cmdvalider_Click()
      Dim i As Integer
      'vérifier le nom
      For i = 1 To UBound(Code)
      'Ucase pour ne pas faire de diff entre maju et minuscule (cela ne fonctionne pas)
      If UCase(NomUtilisateur) = UCase(NomUtil(i)) Then
      If TextBox1.Text = Code(i) Then
      'ICI C'EST BON, faire la suite des opérations.
      Stop
      Else
      'Le code ne correspond pas
      MsgBox "Votre code est incorrect", _
      vbCritical, "Entrée Loging" (peut tu me la traduire je ne comprend pas)
      End If
      End If
      Next i
      TextBox1.Text = ""
      TextBox1.SetFocus
      End Sub

      dans le module

      Option Explicit

      'pour enlever la croix rouge de fermeture de l' UF
      Public Declare Function GetWindowLongA Lib "user32" _
      (ByVal hwnd As Long, ByVal nIndex As Long) As Long

      Public Declare Function SetWindowLongA Lib "user32" _
      (ByVal hwnd As Long, ByVal nIndex As Long, _
      ByVal dwNewLong As Long) As Long

      Public Declare Function FindWindowA Lib "user32" _
      (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

      ( tout cela pour juste pour enlever la croix rouge de fermeture de l' UF)

      Public Code() As String
      Public NomUtil() As String
      Public NomUtilisateur As String
      merci de me donner des reponces au parties soulignés s.v.p
      car je nage un peut!!!!!
  5. salut lermit

    hola.... super génial

    c'est exactement ce que je voulais merci...
    mais je vais te poser une question quand même sur le prog que j'ai fait.
    quand tu frappes le prog suivant:

    if nomutilisateur = "personne1" and code = code1 then
    msgbox("code valide")
    useforme1.hide
    useforme2.show
    else
    msgbox("code invalide")
    exit sub' ligne que je dois enlever pour que cela fonctionne
    end if

    if nomutilisateur = "personne2" and code = code2 then
    msgbox("code valide")
    useforme1.hide
    useforme2.show
    else
    msgbox("code invalide")
    exit sub ' ligne que je dois enlever pour que cela fonctionne
    end if

    Pourquoi le prog ne va pas directement sur la condition 2, si je selectionne la personne2. On dirait qu'il ne prend pas en compte la condition: if nomutilisateur = "personne2".

    Donc c'est pour cela que je dois enlever la ligne exit sub pour toute les personnes sauf pour la dernière car le prog m'exécute toute les lignes de commandes, resultat une msgbox affiche code invalide tant que les deux conditions ne sont pas remplies.

    je pense que cela peut fonctionner si je remplace ( if nomutilisateur = "personne2".) par (if optionboutton2 = true)
    je vais faire un essais, mais cela me parait pas logique,si cela fonctionne comme cela et pas de l'autre.

    dite moi pourquoi s.v.p
    merci
    1. Contributeur
      https://www.cjoint.com/?ipcEHCDNwu
      celui-ci correspondra un peu mieux à ce que tu veux.
      1. salut
        Ne repond pas à mon méssage précèdent car, je croix avoir compris.

        je pense que cela doit être possible, mais pas trés intéressant.

        Car, il est stupide de réalisé un prog de cette façon. Il faudrait faire appelle à des modules pour chaque personnes.
        cela aurait pour consécance un prog volumineux et une modif du prog pour chaque nouvelles personnes qui doivent l'utuliser.

        dit-moi juste pour savoir, ai je raison ?
        Esque cela est possible? car ne sais pas utiliser les modules pour l'intant.
      2. Contributeur
        @jojo9999Difficile de te répondre, je ne connaîs pas la finalité de ton appli.
    2. Contributeur
      Bonjour,
      Pourquoi demander de valider le nom d'utilisateur ? puisque tu demande seulement de cliquer sur une option ? ça n'a aucun sens. En couplant le code et le nom d'utilisateur tu peu avoir les deux. ey si tu veux deux contrôle, comme par exemple quand tu t'inscrit sur CCM, alors c'est avec deux textbox que tu doit travailler.
      Un exemple ?
      https://www.cjoint.com/?ipammDfKgf
      A+
      1. salut lermit...

        Pourquoi demander de valider le nom d'utilisateur ? puisque tu demande seulement de cliquer sur une option ?
        la raison pour laquelle jutilise une option c'est pour evite a l'utilisateur de tapez son nom.
        Ensuite je rentre le nom de l'utilisateur dans une variable pour pouvoir l'utiliser sa valeur dans une autre useforme est l'inscrire dans un tableaux excel, mais pour l'instant je n'en suis pas la.

        merci pour ton exemple je croix que j'ais du boulot devant moi pour le comprendre.

        encore merci.
        a+
      2. Contributeur
        @jojo9999Si c'est pour lui éviter de taper son nom, faut pas lui demander!!, tu peu l'avoir uniquement avec l'entrée du code.
        EDIT:
        Je crois que j'ai compris ton optique, tu veux quand même controller que le code corespond bien au nom. Serait plus facile d'employer une listbox.
      3. @lermite222oui..oui... tres tres logique et vrais

        Mais je fais cela, car grace a toi cela ma donner une idée de prog pour mon boulot et nous sommes une equipe de 6 personne mais elas dans le pas.
        il y a deux qui ne maitrise pas excel (donc perte de temps a la frappe) et une qui ne reteindras pas le code si je ne met pas un code simple du style ses initiales.

        donc je pense que tu vois ma demarche.
    3. pour moi ces lignes de prog:
      cela dit si la variable (nomutilisateur)=personne1 et que la variable (code) et differente que le code1 alors affichez code invalide.
      est-ce que je me trompe?

      non, c'est bien ça!

      donc voila pourquoi quand je tape un code faux dans la textbox1 il ne se passe rien.

      C'est ce que j'essaye de voir

      Et si je tape le bon code rein non plus

      alors la c'est normal, puisque rien ne dit ce qu'il faut faire quand le code est bon!

      Un pb dans ta Sub CommandButton1_Click() :
      si ta texbox est vide , tu continues quand même les tests .

      si tu pouvais mettre ton fichier sur https://www.cjoint.com/

      et renvoyer un post avec le lien de ce fichier ca faciliterai les choses
      1. bonsoir et merci de ton aide

        je comprend les modif que tu a faite sauf cela:

        MsgBox nomutilisateur & " CODE1:" & code1 & " CODE:" & code

        peut tu me la traduire?

        merci....
      2. @jojo9999C'est juste pour faire afficher le contenu des variables :nomutilisateur, code1 et code,

        pour voir ce qu'elles contiennent !!!!

        Ce n'est bien sur pas utile au déroulement du programme, juste une aide !
      3. @jojo9999MsgBox nomutilisateur & " CODE1:" & code1 & " CODE:" & code

        le & permet de concatener
        " " permettent faire afficher littéralement ce que tu saisis entre

        MsgBox nomutilisateur & " CODE1:" & code1 & " CODE:" & code affichera:

        le contenu de la variable nomutilisateur,
        suivi de CODE1: ,
        suivi du contenu de la variable code1,
        suivi de CODE:,
        suivi du contenu de la variable code
    4. Ben... en l'occurence rien ne se passera si code=code1 (sauf si tu as codé un else)

      as tu vérifié que tes variables contiennent quelque chose ?
      1. salut
        merci de ton aide ,suite a ta question j'ai modifier mon prog pour qui affiche a chaque evenements les valeurs de mes variables.
        Et elle sont justes,donc j 'en deduit que le probléme vient de ma ligne de prog suivante:
        if nomutilisateur= "personne1" and code <> code1 then
        msgbox ("Code invalide")
        end if

        pour moi ces lignes de prog:
        cela dit si la variable (nomutilisateur)=personne1 et que la variable (code) et differente que le code1 alors affichez code invalide.
        est-ce que je me trompe?
        merci
        a+
      2. salut
        jais oublie de te dire que j'ais refait mon prog de cette façon:

        Dim code As String
        Dim nomutilisateur As String
        Dim code1 As String
        Dim code2 As String
        Dim code3 As String
        Dim code4 As String
        Dim code5 As String
        Dim code6 As String
        --------------------------------------------------------------------
        Private Sub OptionButton1_Click()
        nomutilisateur = "personne1"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub OptionButton2_Click()
        nomutilisateur = "personne2"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub OptionButton3_Click()
        nomutilisateur = "personne3"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub OptionButton4_Click()
        nomutilisateur = "personne4"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub OptionButton5_Click()
        nomutilisateur = "personne5"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub OptionButton6_Click()
        nomutilisateur = "personne6"
        TextBox1.Value = ""
        End Sub
        --------------------------------------------------------------------
        Private Sub UserForm_Initialize()
        code = TextBox1.Value

        code1 = Sheets("code").Range("B2").Value
        code2 = Sheets("code").Range("B3").Value
        code3 = Sheets("code").Range("B4").Value
        code4 = Sheets("code").Range("B5").Value
        code5 = Sheets("code").Range("B6").Value
        code6 = Sheets("code").Range("B7").Value

        OptionButton1.Value = False
        OptionButton2.Value = False
        OptionButton3.Value = False
        OptionButton4.Value = False
        OptionButton5.Value = False
        OptionButton6.Value = False

        End Sub
        --------------------------------------------------------------------------------------------------------------------------------
        Private Sub CommandButton1_Click()

        MsgBox (nomutilisateur)

        If TextBox1.Value = "" Then
        MsgBox ("Entrez votre code en minuscule s.v.p")
        End If

        If nomutilisateur = "pesonne1" And code <> code1 Then
        MsgBox ("code invalide")
        End If

        If nomutilisateur = "personne2" And code <> code4 Then
        MsgBox ("code invalide")
        End If

        If nomutilisateur = "personne3" And code <> code6 Then
        MsgBox ("code invalide")
        End If

        If nomutilisateur = "personne4" And code <> code5 Then
        MsgBox ("code invalide")
        End If

        If nomutilisateur = "personne5" And code <> code3 Then
        MsgBox ("code invalide")
        End If

        If nomutilisateur = "personne6" And code <> code2 Then
        MsgBox ("code invalide")
        End If

        End Sub

        donc voila pourquoi quand je tape un code faux dans la textbox1 il ne se passe rien.
        Et si je tape le bon code rein non plus
        et mes variables prennent bien les valeurs qu il faut.

        merci de votre reponce
        a+
      3. @jojo9999J'ai trouvé le Pb: ta variable code était initialisée alors que rien n'avait encore été saisi dans textbox1 !!
        elle était donc toujours vide. (tu m'as dit que tu avais vérifié ??!!)

        j'ai modifié ta sub CommandButton1_Click():

        Private Sub CommandButton1_Click()

        code = TextBox1.Value '**** on aurait pu le faire dans la Sub TextBox1_Change()

        If nomutilisateur = "" Or code = "" Then
        MsgBox "selectionnez un utilisateur, ou saisissez votre code"
        Exit Sub '****on ne continue pas
        End If

        MsgBox nomutilisateur & " CODE1:" & code1 & " CODE:" & code

        If nomutilisateur = "personne1" And code = code1 Then
        MsgBox "Le code est bon"
        '****écrire les actions à exécuter ici
        Exit Sub
        Else
        MsgBox ("code invalide")
        Exit Sub
        End If

        '***************à adapter pour les autres noms utilisateurs**************

        End Sub

        Chez moi ça marche et j'espère que chez toi aussi, parce que demain c'est les vacances!!!!!!
    5. salut
      oui c'est çà, mais j'ais déja fais cette commande est rien ne ce passe.
      merci de ton aide...
      1. Quand tu écris:
        if nomutilisateur = "personne1" then code<>code1 msgbox("Code invalide") cela ne fonctionne pas

        est ce que tu veux afficher le message "code Invalide" si le nomutilisateur = "personne1" ET si code<>code1.

        si c'est ça, alors

        if nomutilisateur = "personne1" and code<> code1 then msgbox("Code invalide")

        si non, j'ai rien compris