Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Import access, traitement, puis ré-export dans access.

8 réponses
Avatar
Thorkhas
Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin>\<monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:\fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:\machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny

8 réponses

Avatar
JB
Bonsoir,

-Requête de Maj d'une table Access en DAO:

Sub MajAccessUpdate()
'cocher Microsoft DAO 3.6 dans Outils/Références
Dim bd As DAO.Database
Set bd = OpenDatabase(ActiveWorkbook.FullName, False, False, "excel
8.0")
Sql = "UPDATE client IN
'C:mesdocexcelmacronouveau1001exemplesaccess2000.mdb' SET
Nom_Client=Ucase(Nom_Client) "
bd.Execute Sql
bd.Close
Set bd = Nothing
End Sub

(Je n'ai jamais rencontré de pb lors de connection à des requêtes
Access d'une BD en réseau)

Cordialement JB


Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Qu ery
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasi on, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuelle ment
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer u ne
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne p ose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accé der à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisé e. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UN ION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des r equetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pour quoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriété s de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des donn ées
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du st yle
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny


Avatar
JB
Update en ADO:

Sub UpdateAccess()
ChDir ActiveWorkbook.Path
Set cnn = New ADODB.Connection
cnn.Open "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ¬cess2000.mdb"
Sql = "UPDATE client SET Nom_Client=Ucase(Nom_Client) "
cnn.Execute Sql
cnn.Close
End Sub

JB


Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Qu ery
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasi on, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuelle ment
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer u ne
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne p ose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accé der à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisé e. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UN ION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des r equetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pour quoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriété s de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des donn ées
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du st yle
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny


Avatar
MichDenis
Utilisation ADO et utilisation d'une requête stockée

Tu peux faire ta requête directement dans Acces et utiliser ADO et lui demander
d'exécuter ta requête et te retourner les enregistrements dans un recordset.

Un petit exemple de code ... comme Acces est planté, je n'ai pas
pu effectuer de test ...

Évidemment, tu dois ajouter la bibliothèque : "Microsoft Activex Data 2.x Librairy"
'---------------------------------------
Sub test()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim Rst As New ADODB.Recordset

BaseAccess = ThisWorkbook.Path & "" & "Comptoir.mdb"
'Création d'une connection avec la base de données.
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'[Ten Most Expensive Products] = Nom de la requête
'existant dans Access, les crochets sont là à cause
'des espaces dans le nom de la requête...

cnt.CommandText = "[Ten Most Expensive Products]"
cnt.CommandType = adCmdStoredProc
Set Rst = com.Execute

If (Rst.State & adStateOpen) Then
MsgBox "Recordset is open... records returned."
'Pour récupérer le nom des champs
Do
Range("A1").Offset(, C) = Rst.Fields(C).Name
C = C + 1
X = X + 1
Loop Until X = Rst.Fields.Count
'Récupérer les enregistrements
Range("A1").Offset(1).CopyFromRecordset Rst
Rst.Close: Set Rst = Nothing: cnt.Close: Set cnt = Nothing
Else
MsgBox "Recordset not open... no records."
cnt.Close: Set cnt = Nothing
End If

End Sub
'---------------------------------------




"Thorkhas" a écrit dans le message de news:

Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny
Avatar
Thorkhas
Re,

Merci beaucoup pour ta réponse !

J'ai créé ma procédure et je l'ai modifiée mais par contre il plante au
niveau des
commandes cnt. pour définir le type de requête et le texte de la requête en
me disant : "erreur 446 : cet objet ne gère pas les arguments nommés".
bizarre...

Il suffit bien d'avoir la lib Microsoft Activex Data Objects 2.x Library ?
(j'ai la 2.7)

D'autre part cela veut dire qu'avec cette méthode il faudra que je mette
plus ou moins un timer pour que la table reste mise à jour automatiquement
par la procédure ? (ou alors un petit bouton...)

Je continue à chercher..

Merci encore !

JCM


Utilisation ADO et utilisation d'une requête stockée

Tu peux faire ta requête directement dans Acces et utiliser ADO et lui demander
d'exécuter ta requête et te retourner les enregistrements dans un recordset.

Un petit exemple de code ... comme Acces est planté, je n'ai pas
pu effectuer de test ...

Évidemment, tu dois ajouter la bibliothèque : "Microsoft Activex Data 2.x Librairy"
'---------------------------------------
Sub test()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim Rst As New ADODB.Recordset

BaseAccess = ThisWorkbook.Path & "" & "Comptoir.mdb"
'Création d'une connection avec la base de données.
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'[Ten Most Expensive Products] = Nom de la requête
'existant dans Access, les crochets sont là à cause
'des espaces dans le nom de la requête...

cnt.CommandText = "[Ten Most Expensive Products]"
cnt.CommandType = adCmdStoredProc
Set Rst = com.Execute

If (Rst.State & adStateOpen) Then
MsgBox "Recordset is open... records returned."
'Pour récupérer le nom des champs
Do
Range("A1").Offset(, C) = Rst.Fields(C).Name
C = C + 1
X = X + 1
Loop Until X = Rst.Fields.Count
'Récupérer les enregistrements
Range("A1").Offset(1).CopyFromRecordset Rst
Rst.Close: Set Rst = Nothing: cnt.Close: Set cnt = Nothing
Else
MsgBox "Recordset not open... no records."
cnt.Close: Set cnt = Nothing
End If

End Sub
'---------------------------------------




"Thorkhas" a écrit dans le message de news:

Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny





Avatar
MichDenis
Je n'ai toujours pas testé la procédure mais
il y a une faute là :

Set Rst = com.Execute

On devrait lire évidemment :

Set Rst = CNT.Execute



"Thorkhas" a écrit dans le message de news:

Re,

Merci beaucoup pour ta réponse !

J'ai créé ma procédure et je l'ai modifiée mais par contre il plante au
niveau des
commandes cnt. pour définir le type de requête et le texte de la requête en
me disant : "erreur 446 : cet objet ne gère pas les arguments nommés".
bizarre...

Il suffit bien d'avoir la lib Microsoft Activex Data Objects 2.x Library ?
(j'ai la 2.7)

D'autre part cela veut dire qu'avec cette méthode il faudra que je mette
plus ou moins un timer pour que la table reste mise à jour automatiquement
par la procédure ? (ou alors un petit bouton...)

Je continue à chercher..

Merci encore !

JCM


Utilisation ADO et utilisation d'une requête stockée

Tu peux faire ta requête directement dans Acces et utiliser ADO et lui demander
d'exécuter ta requête et te retourner les enregistrements dans un recordset.

Un petit exemple de code ... comme Acces est planté, je n'ai pas
pu effectuer de test ...

Évidemment, tu dois ajouter la bibliothèque : "Microsoft Activex Data 2.x Librairy"
'---------------------------------------
Sub test()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim Rst As New ADODB.Recordset

BaseAccess = ThisWorkbook.Path & "" & "Comptoir.mdb"
'Création d'une connection avec la base de données.
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'[Ten Most Expensive Products] = Nom de la requête
'existant dans Access, les crochets sont là à cause
'des espaces dans le nom de la requête...

cnt.CommandText = "[Ten Most Expensive Products]"
cnt.CommandType = adCmdStoredProc
Set Rst = com.Execute

If (Rst.State & adStateOpen) Then
MsgBox "Recordset is open... records returned."
'Pour récupérer le nom des champs
Do
Range("A1").Offset(, C) = Rst.Fields(C).Name
C = C + 1
X = X + 1
Loop Until X = Rst.Fields.Count
'Récupérer les enregistrements
Range("A1").Offset(1).CopyFromRecordset Rst
Rst.Close: Set Rst = Nothing: cnt.Close: Set cnt = Nothing
Else
MsgBox "Recordset not open... no records."
cnt.Close: Set cnt = Nothing
End If

End Sub
'---------------------------------------




"Thorkhas" a écrit dans le message de news:

Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny





Avatar
Thorkhas
Re bonjour,

Ah oui j'avais vu ca. Je m'étais dit bizarre mais bon...

Quand j'ai corrigé, VBA m'a dit qu'il manquait un parametre obligatoire à
Execute.
Il s'attend à un parametre String, je me suis dit qu'il s'attendait à une
requête.

Finalement voici comment j'ai procédé :

J'ai copié-collé ma requete au format SQL (dans access on peut afficher la
requete en mdoe création mais aussi en mode SQL), j'ai remplacé les " par des
' pour me conformer a la syntaxe VBA Excel.

Puis j'ai passé directement cette requete en SQL :
cnt.Execute(Sql)

et j'ai viré les deux commandes cnt. juste avant cnt.Execute

a marche comme il faut ! Disons que c'est très lent car il y a ~500
résultats analysés dans une autre feuille et pas mal de formules matricielles
aussi qui se fondent sur des résultats intermédiaires (oui, c'est gros). Il
faut que j'optimise mon classeur :)

Merci beaucoup en tous cas pour la solution :)

Cordialement,

JC Montigny




Je n'ai toujours pas testé la procédure mais
il y a une faute là :

Set Rst = com.Execute

On devrait lire évidemment :

Set Rst = CNT.Execute



"Thorkhas" a écrit dans le message de news:

Re,

Merci beaucoup pour ta réponse !

J'ai créé ma procédure et je l'ai modifiée mais par contre il plante au
niveau des
commandes cnt. pour définir le type de requête et le texte de la requête en
me disant : "erreur 446 : cet objet ne gère pas les arguments nommés".
bizarre...

Il suffit bien d'avoir la lib Microsoft Activex Data Objects 2.x Library ?
(j'ai la 2.7)

D'autre part cela veut dire qu'avec cette méthode il faudra que je mette
plus ou moins un timer pour que la table reste mise à jour automatiquement
par la procédure ? (ou alors un petit bouton...)

Je continue à chercher..

Merci encore !

JCM


Utilisation ADO et utilisation d'une requête stockée

Tu peux faire ta requête directement dans Acces et utiliser ADO et lui demander
d'exécuter ta requête et te retourner les enregistrements dans un recordset.

Un petit exemple de code ... comme Acces est planté, je n'ai pas
pu effectuer de test ...

Évidemment, tu dois ajouter la bibliothèque : "Microsoft Activex Data 2.x Librairy"
'---------------------------------------
Sub test()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim Rst As New ADODB.Recordset

BaseAccess = ThisWorkbook.Path & "" & "Comptoir.mdb"
'Création d'une connection avec la base de données.
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'[Ten Most Expensive Products] = Nom de la requête
'existant dans Access, les crochets sont là à cause
'des espaces dans le nom de la requête...

cnt.CommandText = "[Ten Most Expensive Products]"
cnt.CommandType = adCmdStoredProc
Set Rst = com.Execute

If (Rst.State & adStateOpen) Then
MsgBox "Recordset is open... records returned."
'Pour récupérer le nom des champs
Do
Range("A1").Offset(, C) = Rst.Fields(C).Name
C = C + 1
X = X + 1
Loop Until X = Rst.Fields.Count
'Récupérer les enregistrements
Range("A1").Offset(1).CopyFromRecordset Rst
Rst.Close: Set Rst = Nothing: cnt.Close: Set cnt = Nothing
Else
MsgBox "Recordset not open... no records."
cnt.Close: Set cnt = Nothing
End If

End Sub
'---------------------------------------




"Thorkhas" a écrit dans le message de news:

Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny










Avatar
MichDenis
Merci du retour.


"Thorkhas" a écrit dans le message de news:

Re bonjour,

Ah oui j'avais vu ca. Je m'étais dit bizarre mais bon...

Quand j'ai corrigé, VBA m'a dit qu'il manquait un parametre obligatoire à
Execute.
Il s'attend à un parametre String, je me suis dit qu'il s'attendait à une
requête.

Finalement voici comment j'ai procédé :

J'ai copié-collé ma requete au format SQL (dans access on peut afficher la
requete en mdoe création mais aussi en mode SQL), j'ai remplacé les " par des
' pour me conformer a la syntaxe VBA Excel.

Puis j'ai passé directement cette requete en SQL :
cnt.Execute(Sql)

et j'ai viré les deux commandes cnt. juste avant cnt.Execute

a marche comme il faut ! Disons que c'est très lent car il y a ~500
résultats analysés dans une autre feuille et pas mal de formules matricielles
aussi qui se fondent sur des résultats intermédiaires (oui, c'est gros). Il
faut que j'optimise mon classeur :)

Merci beaucoup en tous cas pour la solution :)

Cordialement,

JC Montigny




Je n'ai toujours pas testé la procédure mais
il y a une faute là :

Set Rst = com.Execute

On devrait lire évidemment :

Set Rst = CNT.Execute



"Thorkhas" a écrit dans le message de news:

Re,

Merci beaucoup pour ta réponse !

J'ai créé ma procédure et je l'ai modifiée mais par contre il plante au
niveau des
commandes cnt. pour définir le type de requête et le texte de la requête en
me disant : "erreur 446 : cet objet ne gère pas les arguments nommés".
bizarre...

Il suffit bien d'avoir la lib Microsoft Activex Data Objects 2.x Library ?
(j'ai la 2.7)

D'autre part cela veut dire qu'avec cette méthode il faudra que je mette
plus ou moins un timer pour que la table reste mise à jour automatiquement
par la procédure ? (ou alors un petit bouton...)

Je continue à chercher..

Merci encore !

JCM


Utilisation ADO et utilisation d'une requête stockée

Tu peux faire ta requête directement dans Acces et utiliser ADO et lui demander
d'exécuter ta requête et te retourner les enregistrements dans un recordset.

Un petit exemple de code ... comme Acces est planté, je n'ai pas
pu effectuer de test ...

Évidemment, tu dois ajouter la bibliothèque : "Microsoft Activex Data 2.x Librairy"
'---------------------------------------
Sub test()
Dim C As Integer
Dim cnt As New ADODB.Connection
Dim Rst As New ADODB.Recordset

BaseAccess = ThisWorkbook.Path & "" & "Comptoir.mdb"
'Création d'une connection avec la base de données.
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & BaseAccess

'[Ten Most Expensive Products] = Nom de la requête
'existant dans Access, les crochets sont là à cause
'des espaces dans le nom de la requête...

cnt.CommandText = "[Ten Most Expensive Products]"
cnt.CommandType = adCmdStoredProc
Set Rst = com.Execute

If (Rst.State & adStateOpen) Then
MsgBox "Recordset is open... records returned."
'Pour récupérer le nom des champs
Do
Range("A1").Offset(, C) = Rst.Fields(C).Name
C = C + 1
X = X + 1
Loop Until X = Rst.Fields.Count
'Récupérer les enregistrements
Range("A1").Offset(1).CopyFromRecordset Rst
Rst.Close: Set Rst = Nothing: cnt.Close: Set cnt = Nothing
Else
MsgBox "Recordset not open... no records."
cnt.Close: Set cnt = Nothing
End If

End Sub
'---------------------------------------




"Thorkhas" a écrit dans le message de news:

Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny










Avatar
Thorkhas
Bonjour,

Merci pour le code, je vais voir comment adapter ca...

D'après ce que je vois il n'est pas possible de "faire comme si" on avait
deux tables (d'un coté access, de l'autre excel) pour faire une seule requete
...

Je vais tenter de faire une procédure en VBA qui parcourera tous les
enregistrements Excel et qui fera une requete update pour chacun d'entre eux
(avec les paramètres et valeurs qui vont bien)

Cordialement,

JC Montigny


Update en ADO:

Sub UpdateAccess()
ChDir ActiveWorkbook.Path
Set cnn = New ADODB.Connection
cnn.Open "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ¬cess2000.mdb"
Sql = "UPDATE client SET Nom_Client=Ucase(Nom_Client) "
cnn.Execute Sql
cnn.Close
End Sub

JB


Bonjour !

Alors voila... Mon problème concerne dans un premier temps Microsoft Query
(version 2002, avec access et excel 2002).

Actuellement, j'extrais des données d'une base access vers excel pour
procéder à un retraitement. J'ai créé une requête pour l'occasion, assez
complexe (elle se base sur d'autres requetes croisées dynamiques, des
requetes union, et deux tables plates classiques), que j'exporte manuellement
vers un fichier excel dans lequel je fais mon traitement.

J'aimerais automatiser cette tache (ie, avoir en real time le résultat de ma
requete dans un onglet de mon fichier excel).

Le problème, c'est que quand je fais outil/données externes/créer une
requete, que je selectionne ma base (sur un lecteur réseau mais ca ne pose a
priori pas de probleme) puis ma requete, ca me dit : "impossible d'accéder à
la table : <monchemin><monfichier>.<marequete>"

Je décide alors de créer ma requete en manuel directement dans query.

J'ajoute les tables (du fichier access donc) dont j'ai besoin. Puis une
requete croisé qui passe sans probleme. Puis une autre requete croisée. La
probleme : il me dit qu'il ne peut pas y accéder. Comme il s'agit d'une
requete croisée utilisant les données d'une autre requete, de type UNION
écrite directement en SQL dans accessn je me dis que le probleme vient de la.
J'essaie alors d'importer cette requete et la surprise, elle marche.

Je suis donc coincé à ce niveau la ! je ne peut pas inclure une des requetes
n,écessaires à ma requete finale... Je ne comprends vraiment pas pourquoi
elle coince !

Si quelqu'un a une idée (utiliser autre chose dans query? propriétés de
cette requete croisée? ...)

Sinon ma deuxieme question.. en anticipant..

J'ai trouvé sur ce newsgroup une macro permettant d'exporter des données
excel vers access. C'est bien mais vous avez du comprendre que je voulais
retraiter des données sous excel pour les réexporter dans Access (pour
certaines raisons il est plus simple de procéder comme cela plutot que
d'aller directement modifier dans l'application access...). Probleme, je veux
faire une mise a jour, pas ajouter des données.

Je connais le SQL "classique", à mon avis il faudrait une requete du style
(en adaptant d'apres ce que j'ai compris en lisant la requete exemple) :

UPDATE table IN c:fuichieaccess.mdb SELECT champ1,champ2 FROM
[MaPlageDeDonnées] WHERE table.cle = [MaPlageDeDonnées].cle

Ie, je veux faire en sorte de mettre a jour champ1 et champ2 dans access
sachant qu'on a le meme champ pour la clé.

exactement l'equivalent en SQL "classique" : UPDATE a.champ1,a.champ2 FROM
tableAccess a,tableExcel e WHERE t.cle=a.cle SET
a.champ1=e.champ1,a.champ2=e.champ2

Voici la requete exemple que j'ai trouvée et qui permet de simplement
introduire des données (et pas de mettre a jour) :

INSERT INTO toto IN (c:machin.mdb' SELECT * FROM [Plage]

Merci beaucoup !

Cordialement,

JC Montigny