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 :/
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 :/
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 :/
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 :/
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 :/
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 :/
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 SubBonsoir 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
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
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 SubBonsoir 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
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
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
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
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
WindowsRe,
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
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
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
WindowsRe,
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
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
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
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
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é)
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.
Bon, eh bien c'était probablement raté, mes petites économies de bouts de
chandelle ...
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é)
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.
Bon, eh bien c'était probablement raté, mes petites économies de bouts de
chandelle ...
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é)
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.
Bon, eh bien c'était probablement raté, mes petites économies de bouts de
chandelle ...