VBA:Un code qui ne marche pas!

salut a tous!
voila mon pb:
T_User(login,mot_de_passe)
je voudrait que sur clic au boutons connexion,si le login et le mot de pase sont correct,le formulaire FM_Evaluation s'ouvre sinono au bout d'une 3eme tentitive le programme s'arrete.
mais il me dit erreur:type definie par l'utilisateur non definie au niveau de dim bd as database

Private Sub connexion_Click()
Dim Sql As String
Dim rs As Recordset
Static i As Byte
Dim bd As Database ----> c ici l'erreur

Set rs = bd.OpenRecordset(Sql)
Sql = "SELECT login,[mot_de_passe] FROM T_User WHERE login = '" & Me.txt_user & "' AND [mot_de_passe]='" & Me.txt_pass & "';"

If Not rs.EOF Then
DoCmd.OpenForm "FM_Evaluation", acNormal, , , , acWindowNormal
DoCmd.Close acForm, "F_CONNEXION"
Else
MsgBox "(Identifiant, Mot de Passe) incorrect ", vbInformation, "Connexion"
i = i + 1
End If
If i = 3 Then
MsgBox "Vous avez dépassé le nombre de tentatives autorisés", vbCritical
DoCmd.Quit
End If
Me.Requery
End Sub

24 réponses

Résumé de la discussion

Le sujet concerne une connexion en VBA Access où, après vérification du login et du mot de passe, le formulaire FM_Evaluation doit s’ouvrir, sinon le programme s’arrête après trois tentatives. Des erreurs telles que « type défini par l’utilisateur non défini » apparaissent, notamment à la ligne Set rs = bd.OpenRecordset(Sql), faute à une mauvaise déclaration ou à l’ordre des instructions. Plusieurs réponses recommandent de déclarer correctement les objets DAO (par exemple Dim bd As DAO.Database; Set bd = CurrentDb), puis d’initialiser Sql avant d’appeler OpenRecordset et d’utiliser des paramètres compatibles. D’autres suggèrent de déclarer et d’initialiser les objets DAO, puis d’affecter Sql avant d’appeler OpenRecordset, par exemple Set rs = bd.OpenRecordset("SELECT login, [mot_de_passe] FROM T_User", dbOpenDynaset, dbReadOnly).

Bobot (l’IA à votre service)
  1. Bonjour,

    Vérifie si tu as des références manquantes, si oui décoches les. Vérifies que la référence m$ dao est bien cochée et mets la le + haut possible...

    0
    1. je l'ai fait mais ça n'a rien changé j'ai coché DAO 3.6 onbjet library et j'ai mie le plus haut possible.
      0
      1. Re,

        mets alors :
        Dim bd As dao.Database

        Ca marche ?
        0
        1. non il me met erreur 91
          veriable objet ou variable de bloc with non definie
          au niveau de set rs=bd open recorset
          0
          1. Bon, il faut mettre dao aussi sur ton rs je pense.

            Donc : Dim rs As dao.Recordset

            0
            1. Je viens de relire ton premier message ; tu aurais pas des fois oublié quelquechose ???

              set db=currentdb

              0
          2. eh! oui je l'ai oublié mais
            bon ça ne marche toujours pas ça met l'erreur 91 que j'ai enoncé au dessus.c'est vraiment chiant
            0
            1. tu peux remettre ton code modifié que l'on y voit plus clair STP ?
              0
              1. Private Sub connexion_Click()
                Dim Sql As String
                Dim rs As DAO.Recordset
                Static i As Byte
                Dim bd As DAO.Database
                Set db = CurrentDb
                Set rs = bd.OpenRecordset(Sql)
                Sql = "SELECT login,[mot_de_passe] FROM T_User WHERE login = '" & Me.txt_user & "' AND [mot_de_passe]='" & Me.txt_pass & "';"
                If Not rs.EOF Then
                DoCmd.OpenForm "FM_Evaluation", acNormal, , , , acWindowNormal
                DoCmd.Close acForm, "F_CONNEXION"
                Else
                MsgBox "(Identifiant, Mot de Passe) incorrect ", vbInformation, "Connexion"
                i = i + 1
                End If
                If i = 3 Then
                MsgBox "Vous avez dépassé le nombre de tentatives autorisés", vbCritical
                DoCmd.Quit
                End If
                Me.Requery
                End Sub
                0
                1. Re,

                  Je pense que l'on va y arriver :O)

                  Tu mets :
                  Set rs = bd.OpenRecordset(Sql)
                  et ensuite tu mets sql="....."

                  Ca ne peut pas aller, faut lui dire avant ce que contient ton sql.

                  0
                  1. bah! c ce que j'ai fait avant mais
                    teebo m'a dit que c'est en l'envers il faut mettre le set avant le sql.
                    0
                    1. Si tu lui dit Set rs = bd.OpenRecordset(Sql) , il contient quoi le rs ?
                      Que neni, nada, il ne connait pas sql, il sait juste que c'est une chaine de caractère, plus précisemment que tu l'as déclaré en tant que telle.

                      Alors ça donne quoi ?
                      0
                      1. ça tourne pas les gard!
                        franchement je comprend plus rien une journée entierre! je suis bete ou c'est difficile à faire
                        0
                        1. Bon, tu as un message d'erreur ?

                          0
                          1. penses-tu qu'il faut deja egaler les valeur de login et mot de passe dans la requette?
                            on peut simplement dire

                            sql=select login,mot_de_passe from T_User!
                            et apres on dira
                            if not EOF T_User
                            move first
                            if
                            txtlogin=login and txtmp=mp
                            alors open
                            sinon
                            msg erreure
                            i=i+1
                            movenext.......
                            pour i=3 quit
                            0
                            1. oui!
                              erreur 91 variable objet ou variable de bloc with non definie:

                              Private Sub connexion_Click()
                              Dim Sql As String
                              Static i As Byte
                              Dim bd As Database
                              Dim rs As Recordset
                              Set db = CurrentDb
                              Sql = "SELECT login,[mot_de_passe] FROM T_User WHERE login = '" & Me.txt_user & "' AND [mot_de_passe]='" & Me.txt_pass & "';"
                              Set rs = bd.OpenRecordset(Sql)----> ICI
                              If Not rs.EOF Then
                              DoCmd.OpenForm "FM_Evaluation", acNormal, , , , acWindowNormal
                              DoCmd.Close acForm, "F_CONNEXION"
                              Else
                              MsgBox "(Identifiant, Mot de Passe) incorrect ", vbInformation, "Connexion"
                              i = i + 1
                              End If
                              If i = 3 Then
                              MsgBox "Vous avez dépassé le nombre de tentatives autorisés", vbCritical
                              DoCmd.Quit
                              End If
                              Me.Requery
                              End Sub
                              0
                              1. Bon on va essayé ça, tu fais un copié collé du code ci-dessous, et testes :
                                Private Sub connexion_Click()
                                Dim Sql As String
                                Static i As Byte
                                Dim bd As DAO.Database
                                Dim rs As DAO.Recordset
                                Set db = CurrentDb
                                Sql = "SELECT login,[mot_de_passe] FROM T_User ;"
                                Set rs = bd.OpenRecordset(Sql)
                                dim nb as integer
                                nb=rs.recordcount
                                msgbox nb
                                end sub()

                                Ca affiche quoi ?
                                0
                            2. Contributeur
                              J'ai jamais dit de mettre dans ce sens!
                              Et ensuite tu comprendrais peut être un peu mieux si tu n'avais pas posé deux fois la même question!
                              0
                              1. j'ai fais le copier collé ça affiche :
                                l'erreur 91 :variable objet ou variable de bloc with non definie
                                : au meme endroit Set rs = bd.OpenRecordset(Sql)
                                0
                                1. Bon, je comprends pas là :-(

                                  Change la ligne qui génère l'erreur par :
                                  Set rs = bd.OpenRecordset("SELECT login,[mot_de_passe] FROM T_User ",dbOpenDynaset, dbReadOnly)
                                  0
                                  1. salut! j'ai remplacer le code par la ligne que tu ma donné ca ne marche pas.
                                    il doit bien y avoir une solution?
                                    est-ceque t'a du temps de crere toi ta table et meme 3 membre et leur mot de passe et faire le test sur 2 formulaire? ça marche?
                                    merci
                                    0
                                2. Putain, j'ai de la peau de sosse devant les yeux !!!!!!!
                                  Je t'ai dis de mettre :
                                  Dim bd As DAO.Database
                                  Dim rs As DAO.Recordset
                                  Set db = CurrentDb

                                  Corriges celui que tu veux, mais les 2 doivent être pareil...
                                  0
                                  • 1
                                  • 2