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 29/12/2010, 10h17   #1
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Par défaut requete paramétrée access->excel

Bonjour à tous !

Je (re)viens vers vous en cette fin d'année avec un nouveau problème à résoudre ! Oui, je ne m'en lasse pas.

Voilà la situation, cette fois.

Niveau matériel, je travaille sous XP, avec la suite office 2003. Donc configuration standard, rien de particulier à signaler.

Je dispose d'une appli Access contenant (entre autres) une table de plusieurs champs. Au milieu de tout ça, un champ date. Je veux exécuter une requête paramétrée me permettant de sélectionner tous les champs compris entre deux dates.
Jusque là, rien d'anormal, la requête est exécutée. Mon code est celui-ci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Dim objCmd As ADODB.Command
Dim objParameter As ADODB.Parameter ' Paramètre à passer à la commande
Dim rst As ADODB.Recordset
 
Set objCmd = New ADODB.Command
Set objCmd.ActiveConnection = CNN_Application
'pRequete : contient le nom de la requête, par exple : R_Export_Excel_Statistiques
objCmd.CommandText = pRequete 
'adCmdStoredProc : objet requête Access
objCmd.CommandType = adCmdStoredProc
 
' on ajoute les paramètres :
'   pDebut et pFin : les noms des paramètres,
'   adDate : type des paramètres,
'   les dates "en dur" : valeur à passer en paramètre (écrites en dur pour les tests)
Set objParameter = objCmd.CreateParameter(pDebut, adDate, , , "28/12/2009")
Call objCmd.Parameters.Append(objParameter)
Set objParameter = objCmd.CreateParameter(pFin, adDate, , , "28/12/2010")
Call objCmd.Parameters.Append(objParameter)
 
' Exécution de la requête et récupération du résultat
Set rst = objCmd.Execute()
Là, la requête s'effectue parfaitement, je n'ai aucun pb

Par contre, après, je veux exporter ce résultat sous Excel. J'ai essayé avec deux méthodes :
Code :
1
2
 
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, pRequete, pFichierExcel, True
où pFichierExcel est le nom complet du fichier à créer.
L'erreur sortie est :
"Erreur de traitement 7874.
Impossible de trouver l'objet 'Nom_de_la_requête'."


Code :
1
2
 
DoCmd.OutputTo acOutputStoredProcedure, pRequete, acFormatXLS, pFichierExcel, True
Là, pas d'erreur, mais Access affiche deux petites InputBox avec un champ texte et, en intitulé, les noms des deux paramètres (pDebut et pFin). Autrement dit, avec .OutputTo, Access relance la requête (les paramètres entrés précédemment ne sont pas pris en compte) et redemande à l'utilisateur une saisie (suis-je clair ? ).

Donc en gros, quelqu'un sait-il comment exporter le résultat d'une requête paramétrée ? Ou peut-il m'expliquer pourquoi, avec .TransferSpreadsheet, ma pRequete n'est pas reconnue ?

Je suis à votre écoute !
Merci de m'avoir lu et merci d'avance à tous ceux qui prendront la peine de répondre !
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 11h54   #2
Membre régulier
 
Alexis CANET
Étudiant
Inscription : novembre 2009
Messages : 95
Détails du profil
Informations personnelles :
Nom : Alexis CANET
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2009
Messages : 95
Points : 70
Points : 70
Hello,

Ton bout de code créer ta requête dans access si j'ai bien compri?
Une fois éxécuté ta requéte est créer?

Pourquoi ne pas faire ta requéte en SQL dans ton code avant export?
Deustalos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 12h11   #3
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
La requête est en fait créée via SQL Server Management Studio. En fait, elle apparait dans les requêtes dans le menu Access sous le nom de :

R_Export_Stat_Par_Age_Excel


Sous Access, l'utilisateur choisira donc les paramètres et cliquera sur un bouton. Le bouton fera appel à une fonction (dans un module).

Cette fonction est utilisée à plusieurs reprises, et pas toujours pour R_Export_Stat_Par_Age (parfois avec paramètre(s), parfois sans paramètre). Je ne peux pas entrer la requête "en dur" avant l'export, parce que R_Export_Stat_Par_Age est (vraiment) très sale (elle a été créée à partir de l'assistant SQL server management studio, donc j'ai le code SQL, mais il est tellement long que ça m'embête réellement de le copier-coller dans mon VBA).
Et aussi parce que la fonction est appelée pour plusieurs requêtes. Donc si je copie la requête "en dur" avant l'export, je dois aussi me créer un switch de 3 pages avec toutes les requêtes qui passent potentiellement par cette fonction... C'est sale.

Et euh... pour "une fois éxécuté ta requéte est créer ?", je ne suis pas sûr de ce que tu veux dire, mais au cas où :
Oui, une fois cette ligne exécutée :
Code :
1
2
 
Set rst = objCmd.Execute()
Le rst contient bien toutes les infos. Il faudrait exporter rst en fait ^^

Merci de prendre le temps de te pencher sur mon pb en tout cas
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 12h36   #4
Membre régulier
 
Alexis CANET
Étudiant
Inscription : novembre 2009
Messages : 95
Détails du profil
Informations personnelles :
Nom : Alexis CANET
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2009
Messages : 95
Points : 70
Points : 70
En exportant Rst ca marche?

C'est un peu dur pour moi de comprendre l'enssemble de ton code j'exporte le plus souvent Soit une req Access soi en code SQL.

Mais si les infos que tu doi rentrer sont "Date début" et "date fin", une requéte Access fera l'affaire (avec en condition les champs d'un formulaire)??? non?

dit moi si je fait fausse route
Deustalos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 13h32   #5
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Bah tout peut faire l'affaire... Du moment que l'exportation marche. Donc non, tu fais pas fausse route ^^.
Qu'est-ce que tu appelles une "requête Access" par contre ... ? Parce que j'ai l'impression que c'est ce que je fais, donc je ne vois pas de quoi tu parles...

Et tu ferais comment pour exporter Rst ? Parce que je sais exporter une table/requête, mais un recordset... ?

Merci encore pour ton aide !
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 14h17   #6
Membre régulier
 
Alexis CANET
Étudiant
Inscription : novembre 2009
Messages : 95
Détails du profil
Informations personnelles :
Nom : Alexis CANET
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2009
Messages : 95
Points : 70
Points : 70
Créer une requête avec l'assistant Access revien à créer une requete en SQL.

Tu as ton champs date et tu voudrai qu'il te sorte les enregistrement correspondant entre la date X et la date Y (Qui sont de ce que j'ai compri des varibales?) En SQL cela donne cela:

On va appeller la requête "REQ"
Code :
1
2
3
SELECT Base_BES_SST.Article, Base_BES_SST.Demachat, Base_BES_SST.[Date bes], Base_BES_SST.[Qté requise]
FROM Base_BES_SST
WHERE (((Base_BES_SST.[Date bes])>[X] And (Base_BES_SST.[Date bes])<[Y]));
X et Y pouvant etre les champs d'un formulaire ou l'utilisateur va rentrer ca date de début dans le champ X et ca date de fin dans le champ Y. Aprés avoir renseigner ces champs il clique sur un bouton et cela exporte ta requéte "REQ"

J'éspére que cela te parle et que je suis toujours sur la bonne voi


PI: Pour faire appel au champs d'un formulaire il faut que tu lui indique comme ci dessous:
En form Access [Formulaires]![Nom Formulaire]![Nom du champs]
En SQL [Forms]![Nom Formulaire]![Nom du champs]
Deustalos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 14h53   #7
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Oui oui ça me parle, aucun pb ^^.

En fait, à l'heure actuelle, la requête SQL est écrite de cette façon :

Code :
1
2
 
Select ... From ... Where (TB_CTRATS.CTR_DATE BETWEEN @pDebut AND @pFin)
Pour être honnête, je connaissais même pas cette syntaxe (ce n'est pas moi qui ai développé l'appli, je n'ai fait que la reprendre pour modifier certaines fonctions, et je m'occupe à présent du débuggage). Fin bref.

Donc mon prédécesseur l'a codé de cette manière (via l'assistant Access je pense, en fait).
Donc selon toi, je vire le "BETWEEN @pDebut AND @pFin" et je le remplace par "> [Forms]!...![Champ1] AND < [Forms]!...![Champ2]" ? C'est ça ? (je vais faire qqes tests en attendant ta réponse, quand même ^^)
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 15h05   #8
Membre régulier
 
Alexis CANET
Étudiant
Inscription : novembre 2009
Messages : 95
Détails du profil
Informations personnelles :
Nom : Alexis CANET
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2009
Messages : 95
Points : 70
Points : 70
Between marche aussi,

Oui en gros c'est ce que je te conseille de faire et tu exporte cette requéte avec Transfertspreadsheet et normalement ca roule , j'éspére ne rien avoir omis dans tes explications. Tien moi au courant.

PS: @pDebut et ton @pFin font référence à quoi? il s'agit des deux champs qu'il te demande de remplir lors de l'exécution de ta requéte???
Deustalos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 15h19   #9
Membre régulier
 
Inscription : février 2010
Messages : 100
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 100
Points : 92
Points : 92
Oui ce sont les deux champs à remplir à l'exécution.

Et justement, le problème reste toujours l'export sous Excel... D'une manière ou de l'autre (la tienne ou la mienne), la requête s'exécute impeccablement. Mais à l'export, avec .TransfertSpreadSheet, ça plante (ou, au mieux, les paramètres doivent être à nouveau entrés).

Lorsqu'on exécute
DoCmd.TransfertSpreadSheet ....

le code réexécute la requête (je crois). Et à ce moment là, il ne prend pas en compte les paramètres entrés dans le formulaire (en tout cas, j'ai pas réussi).

MAIS (oui parce qu'il y a un "mais") en fin de compte, tu as quand même résolu mon problème, juste avec ça :

Citation:
En exportant Rst ca marche?


Je l'ai relu il y a 5min là, et jme suis souvenu que j'avais utilisé quelque chose qui permettait ça. Donc en fin de compte, mon code est toujours le même (voir premier message), mais pour la partie "export vers Excel", je ne cherche plus à exporter la requête en elle-même, mais le Recordset rst !

Code :
1
2
3
4
5
6
7
8
9
10
 
Dim XLApp As Excel.Application
Dim XLWorkbook As Excel.Workbook
Set XLApp = CreateObject("Excel.Application")
XLApp.Visible = True
Set XLWorkbook = XLApp.Workbooks.Open(Fichierdesauvegarde)
XLApp.Sheets("Feuil1").Select
 
'Exportation du recordset, ENFIN
XLApp.Cells(2, 2).CopyFromRecordset rst
Et là, ça fonctionne (puisqu'on exporte le résultat de la requête seulement... plus besoin de la rééxécuter.

Voilà..! Merci pour ton aide, qui m'a été très précieuse ! Bonne fin de journée, encore un topic résolu pour developpez.com !
Beub' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2010, 15h36   #10
Membre régulier
 
Alexis CANET
Étudiant
Inscription : novembre 2009
Messages : 95
Détails du profil
Informations personnelles :
Nom : Alexis CANET
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2009
Messages : 95
Points : 70
Points : 70
Humm bizzar pour le formulaire, bien sur il faut que le formulaire soit ouvert, ou alors que els champ de ton formulaire, correspondent à une table et du coup ta requéte s'exécute non plus sur le formulaire mais sur la table .


Enfin bref ta m'éthode pour résoudre ce probléme est marrante et un peu tordu mais si ca fonctionne pour toi tant mieux

@+ Pour de nouvelles aventures

Alex
Deustalos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h03.


 
 
 
 
Partenaires

Hébergement Web