Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/04/2011, 16h50   #1
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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 :
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?
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 18h27   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
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+
__________________
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 09h29   #3
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 10h36   #4
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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 :
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
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 16h09   #5
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
Si ta source de données est dynamique, il faut définir la propriété 'RecordSource' du formulaire à l'ouverture de celui-ci.

Code :
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 :
1
2
3
if not isnull(me.openargs) then
   me.recordsource=me.openArgs
end if
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 09h34   #6
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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+
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 10h24   #7
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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+
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 14h48   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
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 :
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+
__________________
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h17   #9
Invité de passage
 
Homme Thomas
Stagiaire SIG
Inscription : avril 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Thomas
Localisation : France

Informations professionnelles :
Activité : Stagiaire SIG

Informations forums :
Inscription : avril 2011
Messages : 8
Points : 0
Points : 0
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 ^^
thomas17180 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 16h27   #10
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 462
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 462
Points : 7 539
Points : 7 539
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 :
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+
__________________
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h19.


 
 
 
 
Partenaires

Hébergement Web