IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Requête paramétrée en VBA et erreur 91


Sujet :

VBA Access

  1. #1
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut Requête paramétrée en VBA et erreur 91
    Bonjour à tous !

    En m'aidant de la FAQ je voulais passer des paramètres dans le chargement de ma requête en VBA.
    La solution de base était la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set tbinit = CurrentDb.OpenRecordset("R_Feuille_Presence", dbOpenDynaset, dbSeeChanges)
    Mais le problème est que dans ma requête j'ai 5 critères qui dépendent d'un formulaire. Aussi j'ai tenté de modifier comme il suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim tbinit As DAO.Recordset
    Dim QD1 As DAO.QueryDef
    Dim DB As Database
     
    Set QD1 = DB.QueryDefs("R_Feuille_Presence")
    With QD1
        .Parameters![Sa_id] = IIf(IsNull([Formulaires]![F_Feuille_Presence]![Lst_Salarie]), [Sa_id], [Formulaires]![F_Feuille_Presence]![Lst_Salarie])
        .Paramters![Se_id] = IIf(IsNull([Formulaires]![F_Feuille_Presence]![Lst_Service]), [Se_id], [Formulaires]![F_Feuille_Presence]![Lst_Service])
        .Parameters![Re_id] = gPlant
        .Parameters![Month([Ho_jourscontrat]] = [Formulaires]![F_Feuille_Presence]![Lst_Mois]
        .Parameters![Year([Ho_jourscontrat]] = [Formulaires]![F_Feuille_Presence]![Lst_Annee]
    End With
    Set tbinit = QD1.OpenRecordset
    Mais pour le moment cela me renvoi une erreur 91 variable objet ou variable de bloc With non définie :/. Du coup je galère un peu.

    Sauriez-vous d'où cela peut venir ?

    Merci d'avance !

    Sardaucar

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour,

    essaye .

    Sinon dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Parameters![Sa_id] = IIf(IsNull([Formulaires]![F_Feuille_Presence]![Lst_Salarie]), [Sa_id], [Formulaires]![F_Feuille_Presence]![Lst_Salarie])
    À quoi réfère , [Sa_id], à un champ de formulaire, un champ dans la source de données ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Montre le sql de ta requête R_Feuille_Presence.
    Ne peux-tu y faire directement référence au contenu de ton formulaire ?

    Un exemple ici : http://claudeleloup.developpez.com/t...icritere/#LV-A


    à René, qui a posté pendant que je rédigeais !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  4. #4
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    Bonjour et merci !

    J'ai essayé les guillemets sans suucès :/.

    Voici le sql de ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CurrentDb.CreateQueryDef "RTest", _
    " SELECT Saisonnier.Sa_id, Service.Se_id, Responsable.Re_id, Saisonnier.Sa_nom, Saisonnier.Sa_prenom, Responsable.Re_nom, Responsable.Re_prenom, Service.Se_libelle, Entite.En_libelle, Qualification.Qu_libelle, Statut.St_libelle, Contrat.Co_datedeb, Contrat.Co_datefin, Contrat.Co_basehoraire, Horaire.Ho_jourscontrat, Horaire.Ho_repas, Horaire.Ho_heures, Absence.Ab_acronyme, Contrat.Co_id" & _
    " FROM Absence RIGHT JOIN (Entite INNER JOIN (Responsable INNER JOIN (Service INNER JOIN (Qualification INNER JOIN (Statut INNER JOIN (Saisonnier INNER JOIN (Contrat INNER JOIN Horaire ON Contrat.Co_id = Horaire.fk_contrat) ON Saisonnier.Sa_id = Contrat.fk_saisonnier) ON Statut.St_id = Contrat.fk_statut) ON Qualification.Qu_id = Contrat.fk_qualification) ON Service.Se_id = Contrat.fk_service) ON Responsable.Re_id = Service.Fk_responsable) ON Entite.En_id = Service.Fk_entite) ON Absence.Ab_id = Horaire.fk_absence" & _
    " WHERE (((Saisonnier.Sa_id)=IIf(IsNull([Formulaires]![F_Feuille_Presence]![Lst_Salarie]),[Sa_id],[Formulaires]![F_Feuille_Presence]![Lst_salarie])) AND ((Service.Se_id)=IIf(IsNull([Formulaires]![F_Feuille_Presence]![Lst_Service]),[Se_id],[Formulaires]![F_Feuille_Presence]![Lst_Service])) AND ((Responsable.Re_id)=[Formulaires]![F_Feuille_Presence]![Re_id]) AND ((Month([Ho_jourscontrat]))=[Formulaires]![F_Feuille_Presence]![Lst_Mois]) AND ((Year([Ho_jourscontrat]))=[Formulaires]![F_Feuille_Presence]![Lst_Annee]))"

    Sa_id, Se_id Re_id font référence à des champs de ma requête, Month et Year sont des champs calculés (month pour extraire le mois d'une date, year pour l'année).

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour, pas évident d'interpréter un tel SQL !

    Ne peux-tu pas construire avec l'interface QBE une requête qui te donne directement le résultat quand ton formulaire est ouvert ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #6
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    En fait c'est ce que j'ai fait, ma requête est déjà créée et fonctionne. Le problème c'est que je dois l'appeler pour réaliser un traitement dessus, mais quand je l'appelle en vba quand bien même mon formulaire est ouvert, il me demande de rentrer à nouveau les paramètres.

    Je te mets le code si ça peut t'aider (sachant qu'il fonctionne très bien tant que ma requête n'a pas de critères à définir (si je les choisis moi même en dur)).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Dim idate As Date
    Dim tbinit As DAO.Recordset
    Dim rst As DAO.Recordset
    Dim ssql As String
     
    'Instancier la table initiale
    'c'est là qu'il n'aime pas que je ne renseigne pas mes paramètres ^^'.
    Set tbinit = CurrentDb.OpenRecordset("R_Feuille_Presence", dbOpenDynaset, dbSeeChanges)
     
    'Instancier un recordset avec les numéros d'Id existants
    Set rst = CurrentDb.OpenRecordset("SELECT R_Feuille_Presence.Sa_id,R_Feuille_Presence.Se_id,R_Feuille_Presence.Sa_nom,R_Feuille_Presence.Sa_prenom" _
                                        & " FROM R_Feuille_Presence" _
                                        & " GROUP BY R_Feuille_Presence.Sa_id,R_Feuille_Presence.Se_id,R_Feuille_Presence.Sa_nom,R_Feuille_Presence.Sa_prenom")
    With rst
        .MoveFirst
        'Parcourir tous les numéros distincts
        While Not .EOF
            'parcourir les dates selon les limites établies
            For idate = Forms!F_Feuille_Presence.DateDeb To Forms!F_Feuille_Presence.DateFin
                'Chercher dans la table initiale si le numéro et date existe
                tbinit.FindFirst "[Sa_id]=" & rst![Sa_id] & " AND [Ho_jourscontrat]=#" & Format(idate, "mm/dd/yyyy") & "#"
                If Not tbinit.NoMatch Then 'Si valeurs trouvées
                    ssql = "INSERT INTO FeuillePresence ( Sa_id, Ho_jourscontrat, Ho_heures, Se_id, Sa_nom, Sa_prenom )" _
                        & " VALUES (" & tbinit![Sa_id] & ",#" & Format(tbinit![Ho_jourscontrat], "mm/dd/yyyy") & "#,'" & tbinit![Ho_heures] & "','" & tbinit![Se_id] & "','" & tbinit![Sa_nom] & "','" & tbinit![Sa_prenom] & "')"
                    DoCmd.SetWarnings False
                    DoCmd.RunSQL ssql
                    DoCmd.SetWarnings True
                Else
                    ssql = "INSERT INTO FeuillePresence ( Sa_id, Ho_jourscontrat, Se_id, Sa_nom, Sa_prenom,Ho_Heures )" _
                        & " VALUES (" & rst![Sa_id] & ",#" & Format(idate, "mm/dd/yyyy") & "#,'" & rst![Se_id] & "','" & rst![Sa_nom] & "','" & rst![Sa_prenom] & "','')"
                    DoCmd.SetWarnings False
                    DoCmd.RunSQL ssql
                    DoCmd.SetWarnings True
     
                End If
            Next idate
        .MoveNext
        Wend
    End With
    rst.Close: Set rst = Nothing
    tbinit.Close: Set tbinit = Nothing

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    'c'est là qu'il n'aime pas que je ne renseigne pas mes paramètres ^^'
    C'est peut-être aussi compliqué pour lui !

    J'essaierais ceci :
    - transforme ta requête actuelle en une requête "création de table" (ou, après avoir vidangé la cible, une requête "ajout" si particularités nécessaires) ;
    - exécute cette requête ;
    - et pour ton recordset, exploite la table ainsi créée.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  8. #8
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    - exécute cette requête ;
    Ok mais à l’exécution de ma requête (qui passera donc en vba) je devrais à nouveau intégrer les paramètres non ?

  9. #9
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Je ne sais pas si tu me comprends.

    Oui ou non, peux-tu créer une requête sans paramètre, c’est-à-dire une requête
    - qui fait référence aux valeurs actuellement affichées dans ton formulaire (sur la ligne critère, une syntaxe comme Formulaires!LeNomDuFormulaire!LeNomDuContrôle) ;
    - qui ramène les enregistrements que tu veux ensuite manipuler dans ton recordset ?

    • Si oui, tu l’écris et tu l’enregistres. Quand les valeurs de ton formulaire les valeurs changent, cette requête n’a plus besoin d’être adaptée, il suffit de l’exécuter et elle ne te demandera pas de donner la valeur des paramètres… puisqu’il n’y en a pas !

    • Si non, essaie de nous faire comprendre pourquoi ce n’est pas possible.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  10. #10
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    Alors oui c'est ce que j'ai créé :

    Nom : Capture.PNG
Affichages : 224
Taille : 7,6 Ko

    Mais je ne vois pas ce que tu veux dire par :

    Quand les valeurs de ton formulaire les valeurs changent, cette requête n’a plus besoin d’être adaptée, il suffit de l’exécuter et elle ne te demandera pas de donner la valeur des paramètres… puisqu’il n’y en a pas !
    Simplement par ce que c'est déjà ce que je croyais faire avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set tbinit = CurrentDb.OpenRecordset("R_Feuille_Presence", dbOpenDynaset, dbSeeChanges)
    Mais quand je tente d’exécuter ça me mets paramètres manquants, 5 requis.

    Je dois avoir tout faux .

  11. #11
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Quand tu écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set tbinit = CurrentDb.OpenRecordset("R_Feuille_Presence", dbOpenDynaset, dbSeeChanges)
    ton formulaire est bien ouvert et l'enregistrement actualisé ? Car Access réagit comme s'il ne trouvait pas les 5 critères de la clause Where de la requête.
    Essaie en plaçant un Refresh du formulaire avant de solliciter la requête.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  12. #12
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    Oui il est bien ouvert, j'ai placé un .refresh, .recalc et .repaint mais toujours la même fenêtre. Étonnant car quand je je fais la même manip mais dans les critères j'écris en dur (6 pour Sa_id par exemple, etc...) ben du coup ça marche. Donc je penses que ça vient effectivement du formulaire et des critères liés à ce dernier.

  13. #13
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Et en transitant par la création d'une table, ça donne quoi ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  14. #14
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    Je ne vois pas trop comment faire :/. Dois-je :

    Coder en VBA la création d'une table et y ajouter les enregistrements de ma requête ? Ou transformer ma requête en requête ajout et l’exécuter dans mon code pour y mettre les données ?

  15. #15
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Simplement, tu transformes ta requête actuelle en requête "création de table",
    Dans ton code VBA, tu déclenches l'exécution de cette requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.OpenQuery "SonNom"
    et pour garnir ton recordset, tu assignes cette table.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  16. #16
    Membre régulier
    Inscrit en
    Mai 2012
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 219
    Points : 94
    Points
    94
    Par défaut
    Impeccable ! Ça marche et c'est bien plus rapide. Je ne savais pas qu'on pouvais exécuter une requête de création juste en l'appelant dans le code .

    Merci infiniment !

  17. #17
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Ouf, pas fâché ! Mais, je ne m'explique pas pourquoi on doit faire le détour par la création d'une table.

    À la prochaine !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] requête paramétrée en vba
    Par sihamelm dans le forum VBA Access
    Réponses: 11
    Dernier message: 04/11/2012, 22h56
  2. [AC-2010] Requête paramétrée en vba
    Par frannzz dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/08/2012, 15h54
  3. Requête paramétrée depuis VBA
    Par efvsql dans le forum Microsoft BI
    Réponses: 0
    Dernier message: 25/08/2008, 20h24
  4. Erreur de syntaxe sur une requête paramétrée
    Par deglingo37 dans le forum Access
    Réponses: 5
    Dernier message: 16/05/2006, 22h21
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo