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 :

Ouvrir une MsgBox lorsque l'utilisateur ferme la fenêtre de requête


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut Ouvrir une MsgBox lorsque l'utilisateur ferme la fenêtre de requête
    Bonjour à tous,

    Voila je suis actuellement en train de travailler sur un formulaire pour extraire des données INSEE. Pour cela, l'utilisateur choisi les données qu'il souhaite visualiser (dans une listbox, qui contient des requêtes) et l'entité géographique sur laquelle portent ces données (checkbox, permet d'ajouter une condition Where qui s'ajoute à la requête).

    Ensuite, on clique sur le bouton "Visualiser la requête". Tout se déroule bien et une fenêtre contenant le résultat de la requête. Ensuite l'utilisateur doit pouvoir exporter ces résultat vers Excel (une msgbox vbYesNo apparait en même temps que la fenêtre des résultats de la requête).

    Tout le code fonctionne mais pour des raisons d'optimisation je souhaite que lorsque l'utilisateur ferme la fenêtre requête (en cliquant sur la croix en haut à droite), la msgbox vbYesNo demandant s'il veut exporter apparaisse.

    Or je ne sais pas comment faire pour que la Msgbox se déclenche à ce moment précis... (j'ai cherché Close, BeforeClose ect mais rien ne marche....)

    Merci d'avance,
    Thomas

    Voici le code permettant la requête et son affichage (la MsgBox vbYesNo se déclenche à l'ouverture de la requête) :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    '######### requête pour les communes ########
    Private Sub req_commune()
     
    Dim db As DAO.Database
    Dim QryModele As DAO.QueryDef
    Dim RstTable As DAO.Recordset
    Dim strSQLModele As String
    Dim w_sql As String
     
    Set db = CurrentDb
     
     
        w_commune = Me.lst_commune  'On récupere le code de la commune
     
    'Ouvre la table des requetes sur l'enregistrement dont le nom de la requête correspond à celle choisie dans la liste déroulante
    Set RstTable = db.OpenRecordset("SELECT * FROM tblRequete WHERE NomRqt=" & Chr(34) & Me.lst_requete & Chr(34))
     
    'Si la requête est trouvée dans la table,
    If Not RstTable.EOF Then
      'on récupère du code correspondant à la requête
      strSQLModele = RstTable.Fields("CodeRqt")
      'on ajoute la condition (ici la commune sélectionnée)
      w_sql = strSQLModele & " WHERE CODGEO = '" & w_commune & "';"
     
      'On nomme la requête
      w_nomRq = Me.lst_requete & "_" & w_commune
     
      'Si la requête existe déjà alors
      If TesteExistenceRequete(w_nomRq) Then
        'on met à jour le code de la requête
        db.QueryDefs(w_nomRq).SQL = w_sql
      Else
        'Si elle n'existe pas, on créer la nouvelle requête
        db.CreateQueryDef w_nomRq, w_sql
      End If
     
      'Ouverture de la requête
      DoCmd.OpenQuery w_nomRq
     
        If MsgBox("Voulez-vous exporter la requête dans Excel?", vbYesNo, "Exporter vers Excel") = vbYes Then
            Call ExportExcel
        End If
     
    Else
     
    'Si la requête n'existe pas, on avertit que le code SQL n'est pas disponible
    MsgBox "Impossible de trouver la requête dans la table des requêtes. Elle n'a pas été créée..."
    End If
     
    Exit Sub
    Err:
    MsgBox "Une erreur est survenue" & vbCrLf & Err.Description, vbCritical, "ERREUR"
     
    End Sub

    PS : comment insérer le code dans notre post?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Ce que tu pourrais faire, si ta requête affiche toujours les mêmes champs, c'est ouvrir un formulaire en mode feuille de données qui affichera ta requête. Ainsi tu bénéficiera des événements associés au formulaire.

    Sinon, il va sans doute falloir voir avec les API de windows et détecter la fenêtre qui contient ta requête. Si cette fenêtre disparait, la requête a été fermée.

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Merci pour ta réponse rapide, mais malheureusement les champs que la requête contient sont différents. En fait, j'ai plusieurs table qui contiennent les données (une pour les CSP, une pour le chômage...) et une autre table où l'utilisateur renseigne la "base" de la requête (Select * from table_choisie"). L'utilisateur choisi cette base dans une liste déroulante. Ensuite il faut une clause where pour séléctionner l'espace. Ce choix se fait au moyen de checkBox (si chk de la région est coché, alors la clause where est Where champtable_choisie = n°_region). En appuyant sur Visualiser la requête, les 2 parties sont concaténées et permettent d'afficher la requête (différente à chaque fois du coup).

    Sauf que chaque table a des champs différents :s.

    Je vais quand même tester la méthode du formulaire

    Merci encore

  4. #4
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Je suis en train de tester la solution apportée par marot_r mais je rencontre un petit problème.

    En effet, j'ai créé mon formulaire de données (F_REQUETE) qui doit accueillir le résultat des différentes requêtes. Cependant, la requête n'est pas pré-existante, du coup je ne sais comment remplir mon formulaire via le résultat de la requête.

    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
    'on récupère du code correspondant à la requête
      strSQLModele = RstTable.Fields("CodeRqt")
      'on ajoute la condition (ici la commune sélectionnée)
      w_sql = strSQLModele & " WHERE CODGEO = '" & w_commune & "';"
     
      'On nomme la requête
      w_nomRq = Me.lst_requete & "_" & w_commune
     
      'Si la requête existe déjà alors
      If TesteExistenceRequete(w_nomRq) Then
        'on met à jour le code de la requête
        db.QueryDefs(w_nomRq).SQL = w_sql
      Else
        'Si elle n'existe pas, on créer la nouvelle requête
        db.CreateQueryDef w_nomRq, w_sql
      End If
     
      DoCmd.OpenForm "F_REQUETE", acFormDS
      'Ouverture de la requête
      'DoCmd.OpenQuery w_nomRq

    J'essaie avec le DoCmd.OpenForm d'ouvrir le formulaire (après avoir créé la requête donc), celui-ci s'ouvre mais reste vide.
    J'ai tenté de mettre w_sql ou w_nomRq en Wherecondition de Openform mais toujours vide.

    Si quelqu'un à la solution pour remplir le formulaire en fonction de la requête créée juste avant

    Merci d'avance

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Si ta source de données est dynamique, il faut définir la propriété 'RecordSource' du formulaire à l'ouverture de celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    me.RecordSource="NomDeTaRequete"
    Tu peux utiliser le paramêtre OpenArg à la fin du DoCmd pour passer le nom au formulaire.

    cela devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not isnull(me.openargs) then
       me.recordsource=me.openArgs
    end if
    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Encore une fois merci ^^

    Je vais tester ca de suite (j'etais sur une autre mission).

    Par contre, je ne connais pas le parametre Openargs et j'ai fait quelque recherches mais rien de bien convaincant. Tu pourrais m'explique le petit bout de code que tu as mis? (If not...) Et je dois placer ca sur l'evenement ouverture du formulaire de données (accueil des requetes?)

    A+

  7. #7
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Je viens de tester. Alors effectivement le formulaire s'ouvre, il prend en compte le contenu de la requête MAIS (pourquoi il y a toujours un mais???) Les champs restent vides...



    Comment faire pour visualiser la requête?

    Et aussi, lorsque je met w_nomRQ (nom de ma requête) dans le formulaire de données, il ne la reconnais pas (je dirais presque évidemment étant donné qu'elle est définie dans le premier formulaire) mais comment lui dire qu'il doit récuperer le w_nomRq du premier formulaire dans celui qui accueille le résultat???

    svp

    Merci
    A+

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Si tu ouvres ta requête à la main, as-tu des données ?

    Les champs d'affichage du formulaire sont-ils bien associés aux champs de la source ?

    Pour le openArgs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    docmd.OpenForm "NomTonForm",,,,,,"Texte de OpenArgs"
    C'est un paramêtre optionnel qui permet de passer de l'info au formulaire. Ça ne marche que du code vers le formulaire, pas dans l'autre sens. Et comme c'est une chaîne de caractères tu peux y mettre presque n'importe quoi à condition de traiter cette chaîne à l'ouverture du formulaire.

    A+

  9. #9
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Alors, j'ai mis ton code mais ca me donne toujours un tableau vide (pas le cas si ma requete est effectuée a la main, et si je met juste un Docmd.Openquery). Il met le bon nombre d'enregistrements mais sans leur contenu. (cf image postée plus haut)

    Les champs sont différents en fonction des requêtes.

    Par rapport à avant, il y a du mieux car il me dit que le contenu du formulaire = la requete sql que je veux.


    Aussi, j'ai reussi a déclencher l'export quand on clique sur la croix rouge pour fermer le formulaire, et l'export fonctionne correctemment... Il affiche bien le contenu de la requête... Mais j'ai besoin de visualiser les données avant export et malheureusement je ne lis pas en invisible ^^

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 351
    Points : 23 816
    Points
    23 816
    Par défaut
    Je ne sais pas comment tu as monté ton formulaire mais voici comment je procéderai.

    Créer un formulaire indépendant ayant 255 champs texte dont le nom est Champ000 à Champ254. (Au maximum une requête peut avoir 255 champs) avec leurs étiquettes associées (Etiquette000 à Etiquette254).

    Au chargement assigner la source de données à ta requête.

    Puis :

    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
    'Pour chacun des champs dans la source de données, assigne un champ d'affichage.
     
    dim r as dao.recordset:set r=me.recordset
    dim c as control
    dim e as label
    dim i as integer:for i=0 to 254
       set c=me.controls("Champ" & format(i,"000"))
       set e=me.controls("Etiquette" & format(i,"000"))
     
       if i<r.fields.count
           c.visible=true
           c.ControlSource=r.fields(i).name
           e.visible=true
           e.caption=r.fields(i).name
         else
           c.visible=false
           c.ControlSource=null
           e.visible=false
      end if
     
    next i
     
    set c=nothing 'Libère la mémoire utilisée par l'objet
    set e=nothing  'Libère la mémoire utilisée par l'objet
    set r=nothing 'Libère la mémoire utilisée par l'objet
     
    me.requery 'à ajouter peut-être
    A+

Discussions similaires

  1. Powerpoint 2003 - Ouvrir une MsgBox à partir d'Excel
    Par Daejung dans le forum VBA PowerPoint
    Réponses: 2
    Dernier message: 29/11/2008, 15h12
  2. Réponses: 2
    Dernier message: 28/01/2008, 12h41
  3. Une msgBox lorsque le fichier est en lecture seule..
    Par ncazanav dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2008, 12h47
  4. Réponses: 5
    Dernier message: 31/08/2007, 21h49
  5. [VBA-EXCEL]-condition pour ouvrir une msgbox
    Par captaine93 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/08/2006, 20h51

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