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 :

Problème pour filtrer un sous-formulaire à partir d'une requête en VBA [AC-2010]


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 52
    Points : 35
    Points
    35
    Par défaut Problème pour filtrer un sous-formulaire à partir d'une requête en VBA
    Bonjour,

    Après moultes recherches infructueuses pour résoudre mon problème je me tourne vers vous.
    Je souhaite filtrer un sous-formulaire lors du changement de valeur d'une liste déroulante.

    Mon soucis est simple:
    La valeur de la liste déroulante n'est pas ma valeur de filtre, mais elle me permet d'accéder à un enregistrement dans une table. Cet enregistrement contient une valeur dans un champ que je souhaite récupérer pour filtrer mon sous-formulaire. Donc valeur de liste = entrée 1, qui me donne champ 1, qui me donne ma valeur de filtre. Sachant que cette valeur peut dans certains cas être vide ou nulle, mais ça ce n'est pas un soucis, je peux m'en charger.
    C'est moche, mais je n'ai pas trop le choix.

    Jusqu'ici, j'ai abordé le problème en faisant un DLookUp sur mon champ cible pour l'obtenir:

    J'ai tenté le filtre puis la modification du recordsource en désespoir de cause, c'est pour cela qu'il est présent. Je préviens juste.

    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
    Dim verif1 As String
    verif1 = "" & DLookup("[RefContrat]", "t_Facture", "NumFacture = daub_Facture")
     
    If verif1 <> "" Then
           Me.daud_modifContrat.Form.RecordSource = "SELECT RefContrat FROM t_Contrat WHERE RefContrat = verif1;"
     
           'Me.daud_modifContrat.Form.RecordSource = "SELECT RefContrat FROM t_Contrat WHERE RefContrat = " & verif1 & ";"
     
           'Me.daud_modifContrat.Form.filter = "[RefContrat] = " & verif1 & ""
           'Me.daud_modifContrat.Form.FilterOn = True
     
           'Me.daud_modifContrat.Form.filter = "[RefContrat] = " & verif1
           'Me.daud_modifContrat.Form.FilterOn = True
     
           'Me.daud_modifContrat.Form.filter = "[RefContrat] = verif1"
           'Me.daud_modifContrat.Form.FilterOn = True
    End If
    Vous vous en doutez, toutes ces méthodes plantent. J'ai pourtant bien vérifié sur des cas de test, le DLookUp contient bien la valeur que je souhaite récupérer.
    Toutes ces méthodes me retournent l'erreur d'exécution 2467: "L'expression fait référence à un objet fermé ou supprimé.", sur leur ligne respective.

    Constatant que je n'arrivais pas à résoudre le problème, je me suis tourné vers un sujet que j'ai moi-même créé il y a quelques jours: Celui-ci.

    J'ai repris le principe du queryDef, et j'ai gardé le DLookUp étant donné que si la valeur de mon champ est nulle je me retrouve avec un bon gros plantage des familles.
    Voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim verif1 As String
    verif1 = "" & DLookup("[RefContrat]", "t_Facture", "NumFacture = daub_Facture")
    If verif1 <> "" Then
        Dim q As dao.QueryDef
        Dim mabase As Database
        Set mabase = CurrentDb
     
        Set q = mabase.CreateQueryDef("", "SELECT RefContrat FROM t_Facture WHERE NumAgence = daub_Facture;")
        q.Parameters(0).Value = [Forms]![Accueil]![daub_Facture]
        Set t = q.OpenRecordset()
        ...
    End If
    Et là je ne vais pas plus loin: quoi que je fasse, j'obtiens une erreur 3061: Trop peu de paramètres, 2 attendus, sur la ligne de l'OpenRecordset.
    Je précise que j'ai effectivement tenté la syntaxe " & daub_Facture & ";" pour le CreateQueryDef, et vous vous en doutez, ce n'est pas le problème.

    Je suis à court d'idées pour me sortir de mon pétrin, quelqu'un pourrait-il m'aiguiller?

    Merci de m'avoir lu.

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Thugann bonjour,

    Lorsque les variables sont de type string il est nécessaire de protéger celle-ci par des quotes ainsi pour reprendre ton exemple 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    verif1 =DLookup("[RefContrat]", "t_Facture", "[NumFacture]='daub_Facture'")
        if nz(verif1,"")>"" then ' si valeur non nulle et non vide
    	    Me.daud_modifContrat.Form.RecordSource= "SELECT RefContrat FROM t_Contrat WHERE RefContrat = '" & verif1 & "';"
                Me.refresh
        End if
    JimBoLion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 52
    Points : 35
    Points
    35
    Par défaut
    Bonjour, merci de cette réponse rapide.

    Sur ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    verif1 =DLookup("[RefContrat]", "t_Facture", "[NumFacture]='daub_Facture'")
    if nz(verif1,"")>"" then ' si valeur non nulle et non vide
        Me.daud_modifContrat.Form.RecordSource= "SELECT RefContrat FROM t_Contrat WHERE RefContrat = '" & verif1 & "';"
        Me.refresh
    End if
    J'ai dû modifier la première ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    verif1 = "" & DLookup("[RefContrat]", "t_Facture", "[NumFacture] = daub_Facture")
    Sans quoi j'obtiens une erreur 94: "Utilisation incorrecte de Null" (quand bien même j'ai testé sur un enregistrement sans Null...), et j'obtenais par la suite un verif1 vide.
    Cependant je viens de tester avec cette ligne ci-dessus et cela semble fonctionner, merci.

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

Discussions similaires

  1. [AC-2002] Filtrer un sous formulaire à partir d'une zone de liste
    Par peacefull dans le forum IHM
    Réponses: 4
    Dernier message: 30/10/2009, 15h29
  2. Réponses: 1
    Dernier message: 01/10/2008, 21h34
  3. [URL] problème pour créer un url a partir d'une adresse relative
    Par luckyvae dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 04/10/2007, 11h37
  4. Réponses: 1
    Dernier message: 15/06/2007, 22h28
  5. Réponses: 9
    Dernier message: 30/12/2005, 03h00

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