Problème requête SQL (langage VBA access 2007

Bonjour,
Voici le code qui me pose un problème :
i = liste_contact.Value
j = contact_rechercher.Value

strSQL = " SELECT [Nom],[type_contact],[type],[date_contact],[Prénom],[Adresse_de_messagerie],[Téléphone_personnel],[Téléphone_mobile],[Adresse],[Ville],[Département],[Code_postal],[Page_Web],[Remarques] FROM [Contacts] WHERE " & i & " Like ' " & j & " ' ; "
Set rst = CurrentDb.OpenRecordset(strSQL)
Me.Nom = rst("nom")
Me.Prenom = rst("prénom")
Me.mail = rst("Adresse_de_messagerie")
Me.telPers = rst("Téléphone_personnel")
Me.telPort = rst("Téléphone_mobile")
Me.rue = rst("Adresse")
Me.Ville = rst("Ville")
Me.Departement = rst("Département")
Me.cp = rst("Code_postal")
Me.Web = rst("Page_Web")
Me.Notes = rst("Remarques")
Me.type = rst("type")
Me.date = rst("date_contact")
Me.type_contact = rst("type_contact")
rst.Close
Set rst = Nothing

Il me met une erreur sur toutes les lignes me.variable = rst("variable") : "Valeur non valide pour ce champ"

Si quelqu'un a une petite idée je suis preneur! Si vous voulez plus de renseignements n'hésitez pas!
Merci de vos réponses

15 réponses

  1. Bonjour,

    Ca ne serait pas plutôt :

    Me.Nom = rst.Fields("nom") ' ou Me.Nom = rst.Fields(0)
    Me.Prenom = rst.Fields("prénom") ' ou Me.Prenom = rst.Fields(4)
    Me.mail = rst.Fields("Adresse_de_messagerie") ' ou Me.mail = rst.Fields(5)

    etc ...

    ;o)
    0
    1. Non malheureusement ce n'est toujours pas ça.
      Je pense que le problème est dans la requête mais vraiment j'ai tout essayé les différentes formes d'écritures, je comprends pas.
      Merci quand même de vos réponses!
      0
      1. As-tu essayé en remplaçant i et j par des valeurs ?

        ;o)
        0
        1. Oui j'ai essayé avec WHERE " & liste_contact.Value & " Like ' " & contact_rechercher.Value & " ' ; "
          ou avec = sans les '' ...
          ça me fait pareil pour cette requête :
          strSQL = " SELECT [contacts].[ID],[contacts].[Nom],[contacts].[Prénom],[cotisations].[ID],[cotisations].[valeur_cotisation],[cotisations].[a_cotiser],[cotisations].[Année]"
          strSQL = strSQL & " FROM [contacts],[cotisations]"
          strSQL = strSQL & " WHERE [contacts].[ID] = [cotisations].[ID] AND [cotisations].[Année] = " & recherche_annee.Value & " ; "
          Set rst = CurrentDb.OpenRecordset(strSQL)
          tmp_nom = rst("Nom")
          tmp_prenom = rst("Prénom")
          nom_prenom.Value = tmp_nom + tmp_prenom
          resultat_annee.Value = rst("Année")
          resultat_cotise.Value = rst("a_cotiser")
          resultat_valeur.Value = rst("valeur_cotisation")
          rst.Close
          Set rst = Nothing
          0
          1. Je voulais dire avec des valeurs de la base, genre Where 'Toto' Like 'Titi' ... par exemple.

            Pas sûr que le contenu de recherche_annee soit numérique ... mets CInt( recherche_annee.Value).

            Autre chose, évite les accents dans les noms de champs ou de variables, ensuite si tu veux concaténer 2 variables, il ne faut pas employer "+" qui est le signe de l'addition mais "&" : nom_prenom.Value = tmp_nom & " " & tmp_prenom.

            0
            1. Contributeur
              L'operateur "+" fait la concaténation de deux strings.
              L'avantage de "+" par rapport à "&", c'est que le "+" provoque une erreur si un des deux opérants n'est pas un string.
              0
            2. @yg_beC'est bien ce que je dis ... "+" est l'opérateur de l'addition et non de la concaténation. Si tu veux concaténer un string avec un numérique, tu obtiens une erreur en utilisant le "+". Avec "&" tu as la concaténation sans la levée d'une exception.
              0
            3. Contributeur
              @Polux31Moi je préfère
              string + cstr(numerique)
              comme cela j'evite une conversion inattendue.
              0
            4. @yg_beQu'entends-tu par "conversion inattendue" ?

              Tu peux effectivement faire comme ça, mais ne dis pas que "+" est l'opérande de concaténation. C'est une erreur de le croire.

              Faire : string + CStr(numérique) n'est pas propre en programmation et en cas de maintenance du code. Si je dois débeuguer un code et que je trouve ça, j'aurai tendance à penser que c'est une addition et je modifie pour faire : CInt(String) + numérique ...

              Si j'ai String & numérique, je ne m'arrête même pas pour me poser la question sur le résultat attendu.

              ;o)
              0
          2. Contributeur
            Et si tu ne rajoutes pas le "where" dans la requete ?
            Je me demande aussi si tu ne devrais pas tester
            " if not rst.eof "
            avant d'exploiter rst (après openrecordset)
            0
            1. C'est bien les conditions WHERE qui bloque dans chaque requête, j'ai essayé sans et ça marche.
              Polux31 le champ cotisations.année est de type text vu que la date est sous la forme 2003/2004
              D'autres propositions pour les clauses WHERE?
              0
              1. Si cotisations.annee est un string alors il manque les simples cotes :

                [cotisations].[Année] = ' " & recherche_annee.Value & " ' "

                EDIT: Remplace recherche_annee.Value par recherche_annee.Text

                ;o)
                0
            2. Contributeur
              Avant "Set rst = CurrentDb.OpenRecordset(strSQL)",
              fais
              debug.print strsql, ou msgbox strsql.

              Tout te semble normal ?

              Es-tu certain qu'il y a dans la table un enregistrement qui correspond au "where" ?

              Essai de récuperer le texte de strsql (debug.print, par exemple), et utilise ce texte pour une requete "à la main".
              0
              1. Oui il y a bien un enregistrement qui correspondant.
                Rien d'anormal sur msgbox(strSQL) => vide
                Toutes mes requêtes où j'utilise une variable dans la clause WHERE ne marche pas, je commence à désespérer...
                0
                1. Contributeur
                  Comment cela, msgbox (strsql) n'affiche rien ? J'espérais que cela affiche ta requete SQL...
                  Fais aussi un msgbox avec la variable que tu inséres dans la requete. C'est sans doute tes variables qui te posent problème.
                  Je suis surpris que tu n'aies pas de message d'erreur qnad le strsql n'est pas bien rédigé.
                  0
                  1. quand je testais msgbox(strSQL) c'était avant le recordset , quand je le met après il m'affiche correctement ma requête.
                    J'ai un message d'erreur : valeur non valide pour ce champ
                    QUand je fais un msgbox de ma variable , j'ai bien le nom de ma variable.
                    A n'y rien comprendre ^^
                    0
                    1. Contributeur
                      Ajoute "option explicit", à tout hasard, au début de ton code, et déclare toutes tes variables.

                      Change
                      Set rst = CurrentDb.OpenRecordset(strSQL)
                      tmp_nom = rst("Nom")
                      tmp_prenom = rst("Prénom")
                      nom_prenom.Value = tmp_nom + tmp_prenom
                      resultat_annee.Value = rst("Année")
                      resultat_cotise.Value = rst("a_cotiser")
                      resultat_valeur.Value = rst("valeur_cotisation")

                      en :
                      msgbox strsql
                      Set rst = CurrentDb.OpenRecordset(strSQL)
                      if rst.eof then
                      msgbox("resultat vide pour la requete : " + strsql)
                      else
                      tmp_nom = rst("Nom")
                      tmp_prenom = rst("Prénom")
                      nom_prenom.Value = tmp_nom + tmp_prenom
                      resultat_annee.Value = rst("Année")
                      resultat_cotise.Value = rst("a_cotiser")
                      resultat_valeur.Value = rst("valeur_cotisation")
                      end if

                      Sur quelle ligne de code as-tu l'erreur "valeur non valide pour ce champ" ?
                      0
                      1. toujours pas...
                        erreur : trop peu de paramètres : 1 attendu
                        impossible de mettre "option explicit" dans une procédure, mon code est un évènement!
                        0
                        1. Contributeur
                          tu ne peux pas mettre "option explicit" tout en haut du module ?
                          "trop peu de paramètres : 1 attendu" signifie que un des noms de colonne dans la requete SQL ne correspond pas à la definition de la table...
                          examine bien strsql... (msgbox)
                          0