OVH Cloud OVH Cloud

Résultat d'une sélection vers Excel

27 réponses
Avatar
Francis
Bonjour,
Je dispose actuellement d'une transaction qui me permet de faire une
sélection sur un certain nombre de critères, et dont le résultat du
filtre est contenu dans la variable nommée strfiltre. Ce filtre est
appliqué à une requête "Ma_requête" et le résultat peut soit être
affiché à l'écran, soit être imprimé sur un état.
Je voudrais aussi pouvoir transférer ce résultat vers excel, mais là
mes compétences en programmation sont largement insuffisantes. :/
Je suis donc preneur de toute aide en la matière. Merci à l'avance

Francis

--
Francis
fhgc@wanadoudou.fr
LOI DE MOSES
C'est quand on ne regarde pas que le but est marqué.

7 réponses

1 2 3
Avatar
Michel_D
Bonjour,

strfiltre = "WHERE (abs([solde])>=" & Me!MontantMini & ") and (" & _
"abs([solde])<=" & Me!MontantMaxi & ") or (" & "-[solde]>=" & _
Me!MontantMini & ") and (-[solde]<=" & Me!MontantMaxi & ")"

et cette variable est à combiner avec le contenu SQL de ta requête
"[rqt journal des opérations]" que tu n'as pas fourni.

Mais bon apparemment tu as l'air d'avoir avançé avec l'autre solution.


Bonjour Michel,
Désolé, j'ai un problème avec ton code car le fichier excel obtenu n'est
pas filtré du tout.
Voici comment je l'ai transposé dans mon appli:

Dim oRst As DAO.QueryDef 'Est-ce le bon type de Def???
Dim sSql As String
sSql = strfiltre
' Puis soit tu crées une requête
'Set oRst = CurrentDb.CreateQueryDef("MaRequete", sSql)
' ou tu modifies une requête existante
Set oRst = CurrentDb.QueryDefs("rqt journal des opérations")
oRst.SQL = sSql
' et enfin exportation du résultat de la requête vers excel
DoCmd.TransferSpreadsheet 1, 8, "rqt journal des opérations",
"C:Documents and settingsFrancisMes DocumentsAncreFichier.xls"

strfiltre est une variable qui évolue au fil des critères de sélection
et qui, à un certain moment, ressemble à ceci:
strfiltre = strfiltre & "(abs([solde])>=" & Me!MontantMini & ")" & "and"
& "(abs([solde])<=" & Me!MontantMaxi & ")" '& " or " & "(-[solde]>=" &
Me!MontantMini & ")" & "and" & "(-[solde]<=" & Me!MontantMaxi & ")"
Cette variable marche au poil pour l'affichage et l'impression (c'est
Roger qui en a écrit le code).
Le problème vient que si je mets "rqt journal des opérations", j'ai
toujours la totalité de la base, quelle que soit la valeur de strfiltre.
J'ai aussi tenté le coup en prenant l'option où je crée une requête
"MaRequete", et là je n'obtiens plus rien du tout (aucun fichier excel)
Qu'est que j'ai mal fait ou que dois-je faire en plus, stp ?
@+
Francis



Michel_D a formulé la demande :
Une fois que tu auras formalisé ton filtre multicritères cela te donnera
la condition de ta requête, ensuite :

sSql="Le_SQL_de_la_requête"
' Puis soit tu crée une requête
Set oRst=CurrentDb.CreateQueryDef("MaRequete",sSql)
' ou tu modifie une requête existante
Set oRst=CurrentDb.QueryDefs("MaRequete")
oRst.SQL=sSql
' et enfin exportation du résultat de la requête vers excel
DoCmd.TransferSpreadsheet 1,8,"MaRequete","C:ToncheminFichier.xls"



re,
Oui, c'est bien ça. Actuellement, j'ai la possibilité de visualiser
ou d'imprimer ce résultat, mais je voudrais aussi pouvoir l'exporter
au format excel pour traitements complémentaires. Je sais comment
exporter une requête dans sa forme initiale, mais pas après
application d'une sélection multicritères.
Ça ne doit pas être super compliqué, probablement, mais je ne sais
pas faire :/










Avatar
Francis
Bonjour Michel,
En fait, c'est une requête qui a été créée avec l'assistant graphique,
et je me vois bien incapable d'aller trouver son code. Comment faut-il
s'y prendre?


Michel_D avait prétendu :
Bonjour,

strfiltre = "WHERE (abs([solde])>=" & Me!MontantMini & ") and (" & _
"abs([solde])<=" & Me!MontantMaxi & ") or (" & "-[solde]>=" & _
Me!MontantMini & ") and (-[solde]<=" & Me!MontantMaxi & ")"

et cette variable est à combiner avec le contenu SQL de ta requête
"[rqt journal des opérations]" que tu n'as pas fourni.

Mais bon apparemment tu as l'air d'avoir avançé avec l'autre solution.


Bonjour Michel,
Désolé, j'ai un problème avec ton code car le fichier excel obtenu n'est
pas filtré du tout.
Voici comment je l'ai transposé dans mon appli:

Dim oRst As DAO.QueryDef 'Est-ce le bon type de Def???
Dim sSql As String
sSql = strfiltre
' Puis soit tu crées une requête
'Set oRst = CurrentDb.CreateQueryDef("MaRequete", sSql)
' ou tu modifies une requête existante
Set oRst = CurrentDb.QueryDefs("rqt journal des opérations")
oRst.SQL = sSql
' et enfin exportation du résultat de la requête vers excel
DoCmd.TransferSpreadsheet 1, 8, "rqt journal des opérations", "C:Documents
and settingsFrancisMes DocumentsAncreFichier.xls"

strfiltre est une variable qui évolue au fil des critères de sélection et
qui, à un certain moment, ressemble à ceci:
strfiltre = strfiltre & "(abs([solde])>=" & Me!MontantMini & ")" & "and" &
"(abs([solde])<=" & Me!MontantMaxi & ")" '& " or " & "(-[solde]>=" &
Me!MontantMini & ")" & "and" & "(-[solde]<=" & Me!MontantMaxi & ")"
Cette variable marche au poil pour l'affichage et l'impression (c'est Roger
qui en a écrit le code).
Le problème vient que si je mets "rqt journal des opérations", j'ai
toujours la totalité de la base, quelle que soit la valeur de strfiltre.
J'ai aussi tenté le coup en prenant l'option où je crée une requête
"MaRequete", et là je n'obtiens plus rien du tout (aucun fichier excel)
Qu'est que j'ai mal fait ou que dois-je faire en plus, stp ?
@+
Francis



Michel_D a formulé la demande :
Une fois que tu auras formalisé ton filtre multicritères cela te donnera
la condition de ta requête, ensuite :

sSql="Le_SQL_de_la_requête"
' Puis soit tu crée une requête
Set oRst=CurrentDb.CreateQueryDef("MaRequete",sSql)
' ou tu modifie une requête existante
Set oRst=CurrentDb.QueryDefs("MaRequete")
oRst.SQL=sSql
' et enfin exportation du résultat de la requête vers excel
DoCmd.TransferSpreadsheet 1,8,"MaRequete","C:ToncheminFichier.xls"



re,
Oui, c'est bien ça. Actuellement, j'ai la possibilité de visualiser ou
d'imprimer ce résultat, mais je voudrais aussi pouvoir l'exporter au
format excel pour traitements complémentaires. Je sais comment exporter
une requête dans sa forme initiale, mais pas après application d'une
sélection multicritères.
Ça ne doit pas être super compliqué, probablement, mais je ne sais pas
faire :/









--
Francis

THEOREME de la loi de MURPHY
Tout corps plongé dans une baignoire...déclenche systématiquement la
sonnerie du téléphone !




Avatar
Francis
Re,
Je reviens sur le sujet.
Pour être satisfait à 200%, pourrais-tu me dire comment faire pour
désigner l'emplacement d'enregistrement du fichier .xls à la demande,
en particulier sur une clé USB, au lieu de le faire a priori dans le
code.
Il me semble avoir vu ça qquepart dans ce newsgroup, mais je ne
retrouve pas :/
Merci


Le 20/04/2008, Eric a supposé :
Bonjour Francis,

Merci pour le retour et bonne continuation.

Bonjour Eric,

Merci beaucoup pour ton code: réussite 100% du premier coup.
Pour quelqu'un qui n'est pas "un spécialiste de l'Automation", on peut
difficilement imaginer ce qui aurait été mieux si tu l'avais été. :')
Merci encore, et bon dimanche,

Francis

Eric a présenté l'énoncé suivant :
re Bonsoir,

Je ne suis pas un spécialiste de l'automation alors ...
Essaie cette procédure sur clic d'un bouton de commande de ton formulaire
qui affiche tes données filtrées:

Private Sub Commande1_Click()
' Charger la référence Microsoft DAO Library 3.x
' Déclaration en late binding pour éviter les conflits de version
d'Excel
Dim xlApp As Object
Dim xlWbk As Object
Dim xlWks As Object
Dim Col As Integer
Dim Rs As DAO.Recordset

Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Add
Set xlWks = xlWbk.ActiveSheet
'Recupération du jeu d'enregistrements
Set Rs = Me.RecordsetClone
Rs.MoveFirst

'Ecriture du nom des champs sur la ligne 1 d'Excel
For Col = 0 To Rs.Fields.Count - 1
xlWks.Cells(1, Col + 1) = Rs.Fields(Col).Name
Next Col
' Copie du jeu à partir de A2 dans Excel
xlWks.Cells(2, 1).CopyFromRecordset Rs
Rs.Close

'Sauvegarde du classeur
xlApp.Workbooks(1).SaveAs "c:test.xls"
xlApp.Quit

Set Rs = Nothing
Set xlWks = Nothing
Set xlWbk = Nothing
Set xlApp = Nothing
End Sub



Bonsoir Eric,
J'ai appliqué ta proposition, mais le compilateur n'accepte pas la ligne
de code:
xlApp.CurrentWorkbook.SaveAs "NomDuClasseur"
dans laquelle j'ai remplacé NomDuClasseur" par "C:Test"
Ça faisait la même chose avec Next après Rs.Movenext.
Dans les deux cas, j'ai aussi une feuille excel qui s'ouvre, mais rien ne
se passe.
Francis








--
Francis

LOI DE ROGER
C'est seulement après que l'hôtesse a servi le café, que l'avion
traverse une zone de turbulences.
EXPLICATION DE TONTON BERNARD
Le café est la cause principale de turbulences en altitude.




Avatar
Eric
re,

Bon, sans faire dans le détail.
Sur le site de Raymond, à cette adresse :
http://officesystemaccess.seneque.net/apiopenfile.htm

Tu copies dans un module général(Fenêtre de la BD|Onglet Modules) tout
le code qui se trouve au paragraphe 'Fonction à insérer dans un module
standard' ( à l'exception de Option Compare Database et Option Explicit
si ces 2 instructions figurent *déjà* en entête du module). Tu
sauvegardes ce module sous le nom de modAPI. Ce code fait plus que tu
demandes si tu lis la présentation de Raymond mais il peut te servir
dans d'autres circonstances.

Puis tu remplaces la procédure que je t'avais donnée par celle-ci :

Private Sub Commande1_Click()
' Charger la référence Microsoft DAO Library 3.x
' Declaration en late binding pour éviter les conflits de version
d'Excel
Dim xlApp As Object
Dim xlWbk As Object
Dim xlWks As Object
Dim Col As Integer
Dim CheminNomFic As String
Dim Rs As DAO.Recordset

Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Add
Set xlWks = xlWbk.ActiveSheet
'Recupération du jeu d'enregistrements
Set Rs = Me.RecordsetClone
Rs.MoveFirst

'Ecriture du nom des champs sur la ligne 1 d'Excel
For Col = 0 To Rs.Fields.Count - 1
xlWks.Cells(1, Col + 1) = Rs.Fields(Col).Name
Next Col
' Copie du jeu à partir de A2 dans Excel
xlWks.Cells(2, 1).CopyFromRecordset Rs
Rs.Close
' Choix du répertoire de sauvegarde et nom du fichier
CheminNomFic = SaveFile(, MSExcel)
If Len(CheminNomFic) > 0 Then
'Sauvegarde du classeur
xlApp.Workbooks(1).SaveAs CheminNomFic & _
IIf(Right(CheminNomFic, 4) <> ".xls", ".xls", "")
Else
' On a cliqué sur Annuler donc on ne sauve pas
' et on évite grâce à la propriété Saved = True
' la demande de confirmation d'Excel
xlApp.Workbooks(1).Saved = True
End If
xlApp.Quit

Set Rs = Nothing
Set xlWks = Nothing
Set xlWbk = Nothing
Set xlApp = Nothing
End Sub

Lors du clic, une boite de dialogue s'ouvre et te demande de définir le
répertoire et le nom du fichier à sauvegarder.(Boite de dialogue
standard de Windows

Re,
Je reviens sur le sujet.
Pour être satisfait à 200%, pourrais-tu me dire comment faire pour
désigner l'emplacement d'enregistrement du fichier .xls à la demande, en
particulier sur une clé USB, au lieu de le faire a priori dans le code.
Il me semble avoir vu ça qquepart dans ce newsgroup, mais je ne retrouve
pas :/
Merci




--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Francis
Re aussi,
Je n'ai pas fait dans le détail, moi non plus: j'ai appliqué à la
lettre
Un vrai régal, ça a marché super du premier coup.
Merci encore.
Francis


Eric a formulé la demande :
re,

Bon, sans faire dans le détail.
Sur le site de Raymond, à cette adresse :
http://officesystemaccess.seneque.net/apiopenfile.htm

Tu copies dans un module général(Fenêtre de la BD|Onglet Modules) tout le
code qui se trouve au paragraphe 'Fonction à insérer dans un module standard'
( à l'exception de Option Compare Database et Option Explicit si ces 2
instructions figurent *déjà* en entête du module). Tu sauvegardes ce module
sous le nom de modAPI. Ce code fait plus que tu demandes si tu lis la
présentation de Raymond mais il peut te servir dans d'autres circonstances.

Puis tu remplaces la procédure que je t'avais donnée par celle-ci :

Private Sub Commande1_Click()
' Charger la référence Microsoft DAO Library 3.x
' Declaration en late binding pour éviter les conflits de version
d'Excel
Dim xlApp As Object
Dim xlWbk As Object
Dim xlWks As Object
Dim Col As Integer
Dim CheminNomFic As String
Dim Rs As DAO.Recordset

Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Add
Set xlWks = xlWbk.ActiveSheet
'Recupération du jeu d'enregistrements
Set Rs = Me.RecordsetClone
Rs.MoveFirst

'Ecriture du nom des champs sur la ligne 1 d'Excel
For Col = 0 To Rs.Fields.Count - 1
xlWks.Cells(1, Col + 1) = Rs.Fields(Col).Name
Next Col
' Copie du jeu à partir de A2 dans Excel
xlWks.Cells(2, 1).CopyFromRecordset Rs
Rs.Close
' Choix du répertoire de sauvegarde et nom du fichier
CheminNomFic = SaveFile(, MSExcel)
If Len(CheminNomFic) > 0 Then
'Sauvegarde du classeur
xlApp.Workbooks(1).SaveAs CheminNomFic & _
IIf(Right(CheminNomFic, 4) <> ".xls", ".xls", "")
Else
' On a cliqué sur Annuler donc on ne sauve pas
' et on évite grâce à la propriété Saved = True
' la demande de confirmation d'Excel
xlApp.Workbooks(1).Saved = True
End If
xlApp.Quit

Set Rs = Nothing
Set xlWks = Nothing
Set xlWbk = Nothing
Set xlApp = Nothing
End Sub

Lors du clic, une boite de dialogue s'ouvre et te demande de définir le
répertoire et le nom du fichier à sauvegarder.(Boite de dialogue standard de
Windows

Re,
Je reviens sur le sujet.
Pour être satisfait à 200%, pourrais-tu me dire comment faire pour désigner
l'emplacement d'enregistrement du fichier .xls à la demande, en particulier
sur une clé USB, au lieu de le faire a priori dans le code.
Il me semble avoir vu ça qquepart dans ce newsgroup, mais je ne retrouve
pas :/
Merci





--
Francis

LOI DE ROGER
C'est seulement après que l'hôtesse a servi le café, que l'avion
traverse une zone de turbulences.
EXPLICATION DE TONTON BERNARD
Le café est la cause principale de turbulences en altitude.


Avatar
Gloops
Bonjour,

Deux démarches : une un peu empirique, et une plus rigoureuse, que j'ai
un peu fuie en voulant économiser un objet, finalement ce n'était
peut-être pas une bonne idée.

La démarche empirique, d'abord, histoire que je retombe sur mes pieds
avec ce que j'ai déjà lancé.

J'ai vérifié aujourd'hui, cette syntaxe fonctionnait :
xlApp.ActiveWorkbook.SaveAs "test2.xls"

Comme elle s'adresse au classeur actif, je ne vois qu'une explication :
le classeur créé par le code n'est pas activé (l'activation est à un
classeur ou une feuille ce que la sélection est à un champ). ça pou rrait
être intéressant au moment où on est bloqué par l'erreur, de tape r dans
la fenêtre d'exécution d'Access
"? xlApp.ActiveWorkbook.Name" sans les guillemets, et de valider bien
entendu. ça permettrait de vérifier si on a ou non quelque chose dans
ActiveWorkbook. Puis retaper ça après avoir tapé
"xlApp.Workbooks(1).Activate" (sans les guillemets, et validé)

Sans attendre les résultats de ces investigations (effectuées à tit re de
curiosité), le plus simple serait peut-être de sauvegarder le premier
classeur chargé, ce que j'avais évité pour le cas où Excel aurait déjà
été chargé avant le transfert, et le premier classeur chargé ne s erait
alors pas celui qu'on croit.

Pour sauvegarder le premier classeur chargé :
xlApp.Workbooks(1).SaveAs "test.xls"

Pour tenir compte de mes scrupules quant au fait qu'Excel ait déjà é té
chargé avant, avec d'autres classeurs, probablement est-ce plutôt le
dernier classeur chargé qu'il faut sauvegarder. Si je n'en suis pas ven u
là du premier coup c'est que la syntaxe est un peu plus lourde :
xlApp.Workbooks(xlApp.Workbooks.Count).SaveAs "test.xls"

Dans les parenthèses, on a le nombre de classeurs, donc, puisque les
classeurs sont numérotés à partir de 1, le numéro du dernier clas seur
chargé.

(bien entendu, on peut très bien remplacer "test.xls" par "ancre.xls" : ) )

Si on a vraiment peur de se mélanger les pinceaux avec une syntaxe un
peu lourde, on la coupe en deux lignes (plus la déclaration de la
variable) :

Dim NumClass As Integer 'ligne à placer en début de procédure

NumClass = xlApp.Workbooks.Count 'numéro du dernier classeur
xlApp.Workbooks(NumClass).SaveAs "test.xls"

Attention, si NumClass > 1, ça signifie qu'Excel était déjà charg é,
l'instruction xlApp.Quit à la fin n'est donc pas forcément bienvenue.
Il y a des façons plus sophistiquées de s'assurer si Excel était ch argé
avant, mais je doute que ça soit une bonne idée d'attaquer directemen t
par là avant d'avoir un peu programmé d'autres trucs.




Bon, maintenant, venons-en à quelque chose d'un peu plus rigoureux,
histoire d'être sûr de ce qu'on sauvegarde et de ne pas risquer de
tomber sur autre chose si on avait chargé plusieurs classeurs dans Exce l
et déchargé le deuxième par exemple.

Du coup je réalise que je reprends ce qu'a fait Eric, décidément je ne
vais pas emporter le marché sur ce coup-là, sans compter que je suis
aussi bavard que mon code ...

Dim xlApp As Object
Dim xlWbk As Object
Dim xlWks As Object

Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Add
Set xlWks = xlWbk.Worksheets(1)

Du coup, à la fin, pour fermer le classeur, plutôt que de le désign er
par le nom sous lequel on l'a sauvegardé, ça devient plus léger d'é crire :

xlWbk.SaveAs "Ancre.xls"
xlWbk.Close
If xlApp.Workbooks.Count = 0 Then
xlApp.Quit
End If

Set xlWks = Nothing
Set xlWbk = Nothing
Set xlApp = Nothing


et cette fois, on ne ferme Excel que si il n'y a rien dedans.

Bon, eh bien c'était probablement raté, mes petites économies de bo uts
de chandelle ...



Francis a écrit, le 20/04/2008 10:10 :
Bonjour "Gloops",

Un grand merci pour ta réponse super didactique.
Je l'ai mise en application, mais ça bloque car le debugger me dit qu 'il
y a un pb avec la ligne de code suivante:
xlApp.CurrentWorkbook.SaveAs "C:Documents and settingsFrancisMes
documentsAncre"
Si, après Ancre, je mets un nom de fichier.xls, ça fait pareil.
J'ai une feuille excel qui s'ouvre, mais rien ne se passe, et dans
Access j'ai un message: "erreur d'exécution '438'": propriété ou méthode
non gérée par cet objet".
Un avis sur ce que je dois faire en plus? Une référence à activer ???
Bon dimanche et @+
Francis


Avatar
Francis
Bonjour 'Gloops',
Merci beaucoup pour la peine que tu te donnes pour moi.
Comme la solution que m'a donné Eric marche au poil, je suis un peu
moins motivé pour analyser en détail tes propositions, et j'espère que
tu ne m'en tiendra pas rigueur la prochaine fois où j'appellerai à
l'aide. J'ai quand même testé tes propositions.
Pour ce qui est de ta proposition de démarche empirique, ça n'a pas
marché. Je ne suis pas allé jusqu'au bout de toutes tes propositions,
et je suis passé à ton autre proposition.
Voir mes commentaires intégrés à ton texte.

Une fois encore, merci beaucoup pour ton aide, et à une prochaine
occasion, probablement,

Francis


Gloops a émis l'idée suivante :
Bonjour,

Deux démarches : une un peu empirique, et une plus rigoureuse, que j'ai un
peu fuie en voulant économiser un objet, finalement ce n'était peut-être pas
une bonne idée.

La démarche empirique, d'abord, histoire que je retombe sur mes pieds avec ce
que j'ai déjà lancé.

J'ai vérifié aujourd'hui, cette syntaxe fonctionnait :
xlApp.ActiveWorkbook.SaveAs "test2.xls"

Comme elle s'adresse au classeur actif, je ne vois qu'une explication : le
classeur créé par le code n'est pas activé (l'activation est à un classeur ou
une feuille ce que la sélection est à un champ). ça pourrait être intéressant
au moment où on est bloqué par l'erreur, de taper dans la fenêtre d'exécution
d'Access
"? xlApp.ActiveWorkbook.Name" sans les guillemets, et de valider bien
entendu. ça permettrait de vérifier si on a ou non quelque chose dans
ActiveWorkbook. Puis retaper ça après avoir tapé
"xlApp.Workbooks(1).Activate" (sans les guillemets, et validé)


Ceci n'a pas modifié la mauvaise humeur du debugger, et mes feuilles
excel sont restées désespérément vides.
Je suis donc allé vers ta deuxième démarche.

Sans attendre les résultats de ces investigations (effectuées à titre de
curiosité), le plus simple serait peut-être de sauvegarder le premier
classeur chargé, ce que j'avais évité pour le cas où Excel aurait déjà été
chargé avant le transfert, et le premier classeur chargé ne serait alors pas
celui qu'on croit.

Pour sauvegarder le premier classeur chargé :
xlApp.Workbooks(1).SaveAs "test.xls"

Pour tenir compte de mes scrupules quant au fait qu'Excel ait déjà été chargé
avant, avec d'autres classeurs, probablement est-ce plutôt le dernier
classeur chargé qu'il faut sauvegarder. Si je n'en suis pas venu là du
premier coup c'est que la syntaxe est un peu plus lourde :
xlApp.Workbooks(xlApp.Workbooks.Count).SaveAs "test.xls"

Dans les parenthèses, on a le nombre de classeurs, donc, puisque les
classeurs sont numérotés à partir de 1, le numéro du dernier classeur chargé.

(bien entendu, on peut très bien remplacer "test.xls" par "ancre.xls" :) )

Si on a vraiment peur de se mélanger les pinceaux avec une syntaxe un peu
lourde, on la coupe en deux lignes (plus la déclaration de la variable) :

Dim NumClass As Integer 'ligne à placer en début de procédure

NumClass = xlApp.Workbooks.Count 'numéro du dernier classeur
xlApp.Workbooks(NumClass).SaveAs "test.xls"

Attention, si NumClass > 1, ça signifie qu'Excel était déjà chargé,
l'instruction xlApp.Quit à la fin n'est donc pas forcément bienvenue.
Il y a des façons plus sophistiquées de s'assurer si Excel était chargé
avant, mais je doute que ça soit une bonne idée d'attaquer directement par là
avant d'avoir un peu programmé d'autres trucs.




Bon, maintenant, venons-en à quelque chose d'un peu plus rigoureux, histoire
d'être sûr de ce qu'on sauvegarde et de ne pas risquer de tomber sur autre
chose si on avait chargé plusieurs classeurs dans Excel et déchargé le
deuxième par exemple.

Du coup je réalise que je reprends ce qu'a fait Eric, décidément je ne vais
pas emporter le marché sur ce coup-là, sans compter que je suis aussi bavard
que mon code ...

Dim xlApp As Object
Dim xlWbk As Object
Dim xlWks As Object

Set xlApp = CreateObject("Excel.Application")
Set xlWbk = xlApp.Workbooks.Add
Set xlWks = xlWbk.Worksheets(1)

Du coup, à la fin, pour fermer le classeur, plutôt que de le désigner par le
nom sous lequel on l'a sauvegardé, ça devient plus léger d'écrire :

xlWbk.SaveAs "Ancre.xls"
xlWbk.Close
If xlApp.Workbooks.Count = 0 Then
xlApp.Quit
End If

Set xlWks = Nothing
Set xlWbk = Nothing
Set xlApp = Nothing


et cette fois, on ne ferme Excel que si il n'y a rien dedans.


Tel quel, il n'y avait vraiment rien dans la feuille excel créée.
Normal, il manque du code pour ça.
Alors j'ai rajouté ceci juste après Set xlWks etc...

Dim Lig As Integer, Col As Integer
Dim Rs As Recordset

Lig = 1
Set Rs = CurrentDb().QueryDefs("rqt journal des
opérations").OpenRecordset()

While Not Rs.EOF
Lig = Lig + 1
For Col = 0 To Rs.Fields.Count - 1
xlWks.Cells(Lig, Col + 1) = Rs.Fields(Col)
Next
Rs.MoveNext
Wend

Rs.Close
Set Rs = Nothing

et avec ça, ça va déjà beaucoup mieux, car j'ai bien un fichier excel
qui m'est créé au bon endroit, sauf que:
- j'ai toujours la totalité de la table, même si mon filtre n'en a
sélectionné que 3 lignes.
- je n'ai pas la ligne des titres des colonnes. Comme l'avait expliqué
Eric, c'est sans doute une question de réglage du point de départ de la
valeur de lig.

Ça a quand même beaucoup progressé, mais comme j'ai la soluce d'Eric
qui me va bien, tu peux, sans scrupule, accorder ton temps à ceux qui
en ont plus besoin que moi.

Merci encore



Bon, eh bien c'était probablement raté, mes petites économies de bouts de
chandelle ...



--
Francis

LOI DE ROGER
C'est seulement après que l'hôtesse a servi le café, que l'avion
traverse une zone de turbulences.
EXPLICATION DE TONTON BERNARD
Le café est la cause principale de turbulences en altitude.

1 2 3