Lancer une requête Access depuis Excel en VBA

Le
Michel Gaboly
Bonsoir,

J'ai besoin d'alimenter une base Access à partir de documents Excel et =
je rame, car je connais très mal Access.

En l'occurrence mon problème est le suivant : chaque document Excel con=
tient, entre autres choses, une localité et un
département (sous forme de texte, à cause des 01, 02, pour avoir =
toujours 2 caractères).

La base Access contient une table avec le code INSEE des 36000 communes f=
rançaises. Les 2 premiers caractères du code
INSEE correspondent au département, comme un code postal. Je dois alime=
nter une autre table avec une douzaine de champs
dont la localité et le code INSEE.

J'ai construit une requête, "ReqCommune" qui me liste toutes les commun=
es ayant pour nom la valeur d'une cellule nommée
"Localité1" dans le document Excel. Par exemple, il y a 4 "Montréal",=
situés dans 4 départements différents. La voici :

SELECT LOCALITE.insee_comm, LOCALITE.NCC
FROM LOCALITE, Param
WHERE (((LOCALITE.NCC)=[Param].[Localité]));

"Param" est une table qui ne contient qu'un enregistrement, avec la local=
ité et le département, tels qu'ils apparaissent
dans le document Excel.

"Param" est alimentée par la Sub "MAJParam", appelée par la Sub "Test=
1".

Une seconde requête, "ReqCommuneDepConnu", exploite le résultat de la=
première ("ReqCommune") et fait appel à une
fonction, "Test" dont le code est reproduit plus bas. Il s'agit d'élimi=
ner les communes ayant le bon nom, mais situées
dans un autre département :

SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));


A partir de la Sub "Test2", j'arrive à lancer la requête "ReqCommune"=
, sans difficulté particulière.

Par contre je suis incapable (Sub "Test3") de faire pareil avec "ReqCommu=
neDepConnu" : j'obtiens le message (pas très
surprenant d'ailleurs) "Erreur 3085 Fonction 'Test' non définie dans l'=
Expression".

J'ai voulu faire des essais avec

Q.Execute

ou

DB.Execute Q.Sql, dbFailOnError

sans succès ;-((((


Quelqu'un aurait-il une piste ?

Merci d'avance.


Extrait du code VBA Access (fonction utilisée par "ReqCommuneDepConnu" =
:

Function Test(Code$, Dep$)
Test = (Left(Code, 2) = Dep)
End Function


Extrait du code VBA Excel destiné à alimenter la base :

Option Explicit
Private DB As Database, RS As Recordset

Private Sub OuvreBase()
ChDir ThisWorkbook.Path
Set DB = OpenDatabase(ThisWorkbook.Sheets(1).Evaluate("Base"))
End Sub

Private Sub Test1()
MAJParam ActiveWorkbook.Sheets(1).Range("Localité1")
' Suite du code, à venir
End Sub

Private Sub MAJParam(Loc As Range)
OuvreBase
Set RS = DB.OpenRecordset("Param")
RS.Edit
RS!Localité = Loc
RS!Dép = Loc.Offset(2)
RS.Update
RS.Close
DB.Close
End Sub

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Private Sub Test3()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommuneDepConnu")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub


--
Cordialement,

Michel Gaboly
www.gaboly.com
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JièL
Le #4265391
Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seul et
même prog.

Avec Access fait tout simplement un attachement de table excel (si celle
ce est changeante), voire une importation (dans le cas d'infos figées)
dans une table existante ou dans une nouvelle table, et ensuite fais ce
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critères te
telle ou telle autre c'est hyper simple à gérer avec les requêtes alors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nulle part)

--
JièL / Jean-Louis GOUBERT
Là bas mieux qu'en face ;-) http://forums.offices.free.fr/
La NOUVELLE Faq Outlook est là : http://faq.outlook.free.fr/index.php
Les stats de CDO : http://faq.outlook.free.fr/cdo/

Bonsoir,

J'ai besoin d'alimenter une base Access à partir de documents Excel et
je rame, car je connais très mal Access.

En l'occurrence mon problème est le suivant : chaque document Excel
contient, entre autres choses, une localité et un département (sous
forme de texte, à cause des 01, 02, ... pour avoir toujours 2 caractères).

La base Access contient une table avec le code INSEE des 36000 communes
françaises. Les 2 premiers caractères du code INSEE correspondent au
département, comme un code postal. Je dois alimenter une autre table
avec une douzaine de champs dont la localité et le code INSEE.

J'ai construit une requête, "ReqCommune" qui me liste toutes les
communes ayant pour nom la valeur d'une cellule nommée "Localité1" dans
le document Excel. Par exemple, il y a 4 "Montréal", situés dans 4
départements différents. La voici :

SELECT LOCALITE.insee_comm, LOCALITE.NCC
FROM LOCALITE, Param
WHERE (((LOCALITE.NCC)=[Param].[Localité]));

"Param" est une table qui ne contient qu'un enregistrement, avec la
localité et le département, tels qu'ils apparaissent dans le document
Excel.

"Param" est alimentée par la Sub "MAJParam", appelée par la Sub "Test1".

Une seconde requête, "ReqCommuneDepConnu", exploite le résultat de la
première ("ReqCommune") et fait appel à une fonction, "Test" dont le
code est reproduit plus bas. Il s'agit d'éliminer les communes ayant le
bon nom, mais situées dans un autre département :

SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));


A partir de la Sub "Test2", j'arrive à lancer la requête "ReqCommune",
sans difficulté particulière.

Par contre je suis incapable (Sub "Test3") de faire pareil avec
"ReqCommuneDepConnu" : j'obtiens le message (pas très surprenant
d'ailleurs) "Erreur 3085 Fonction 'Test' non définie dans l'Expression".

J'ai voulu faire des essais avec

Q.Execute

ou

DB.Execute Q.Sql, dbFailOnError

sans succès ;-((((


Quelqu'un aurait-il une piste ?

Merci d'avance.


Extrait du code VBA Access (fonction utilisée par "ReqCommuneDepConnu" :

Function Test(Code$, Dep$)
Test = (Left(Code, 2) = Dep)
End Function


Extrait du code VBA Excel destiné à alimenter la base :

Option Explicit
Private DB As Database, RS As Recordset

Private Sub OuvreBase()
ChDir ThisWorkbook.Path
Set DB = OpenDatabase(ThisWorkbook.Sheets(1).Evaluate("Base"))
End Sub

Private Sub Test1()
MAJParam ActiveWorkbook.Sheets(1).Range("Localité1")
' Suite du code, à venir
End Sub

Private Sub MAJParam(Loc As Range)
OuvreBase
Set RS = DB.OpenRecordset("Param")
RS.Edit
RS!Localité = Loc
RS!Dép = Loc.Offset(2)
RS.Update
RS.Close
DB.Close
End Sub

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Private Sub Test3()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommuneDepConnu")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub




JB
Le #4265311
Bonjour,

Exemple de requête paramétrée en DAO:

Sub ReqParamDAO()
Dim bd As DAO.Database
Dim rs As Recordset
Set bd = OpenDatabase(ActiveWorkbook.Path & "Access2000.mdb")
Set q = bd.QueryDefs("R_param_ville")
q.Parameters("nomville") = "paris"
Set rs = q.OpenRecordset
Do While Not rs.EOF
MsgBox rs!nom_client
rs.MoveNext
Loop
End Sub

http://boisgontierj.free.fr/fichiers/jb-excelaccess.zip

JB

On 30 mar, 00:52, JièL
Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère to ut
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seul et
même prog.

Avec Access fait tout simplement un attachement de table excel (si celle
ce est changeante), voire une importation (dans le cas d'infos figées)
dans une table existante ou dans une nouvelle table, et ensuite fais ce
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critères te
telle ou telle autre c'est hyper simple à gérer avec les requêtes a lors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nulle part)

--
JièL / Jean-Louis GOUBERT
Là bas mieux qu'en face ;-)http://forums.offices.free.fr/
La NOUVELLE Faq Outlook est là :http://faq.outlook.free.fr/index.php
Les stats de CDO :http://faq.outlook.free.fr/cdo/




Bonsoir,

J'ai besoin d'alimenter une base Access à partir de documents Excel et
je rame, car je connais très mal Access.

En l'occurrence mon problème est le suivant : chaque document Excel
contient, entre autres choses, une localité et un département (sous
forme de texte, à cause des 01, 02, ... pour avoir toujours 2 caract ères).

La base Access contient une table avec le code INSEE des 36000 communes
françaises. Les 2 premiers caractères du code INSEE correspondent au
département, comme un code postal. Je dois alimenter une autre table
avec une douzaine de champs dont la localité et le code INSEE.

J'ai construit une requête, "ReqCommune" qui me liste toutes les
communes ayant pour nom la valeur d'une cellule nommée "Localité1" dans
le document Excel. Par exemple, il y a 4 "Montréal", situés dans 4
départements différents. La voici :

SELECT LOCALITE.insee_comm, LOCALITE.NCC
FROM LOCALITE, Param
WHERE (((LOCALITE.NCC)=[Param].[Localité]));

"Param" est une table qui ne contient qu'un enregistrement, avec la
localité et le département, tels qu'ils apparaissent dans le docume nt
Excel.

"Param" est alimentée par la Sub "MAJParam", appelée par la Sub "Te st1".

Une seconde requête, "ReqCommuneDepConnu", exploite le résultat de la
première ("ReqCommune") et fait appel à une fonction, "Test" dont le
code est reproduit plus bas. Il s'agit d'éliminer les communes ayant le
bon nom, mais situées dans un autre département :

SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));

A partir de la Sub "Test2", j'arrive à lancer la requête "ReqCommun e",
sans difficulté particulière.

Par contre je suis incapable (Sub "Test3") de faire pareil avec
"ReqCommuneDepConnu" : j'obtiens le message (pas très surprenant
d'ailleurs) "Erreur 3085 Fonction 'Test' non définie dans l'Expressio n".

J'ai voulu faire des essais avec

Q.Execute

ou

DB.Execute Q.Sql, dbFailOnError

sans succès ;-((((

Quelqu'un aurait-il une piste ?

Merci d'avance.

Extrait du code VBA Access (fonction utilisée par "ReqCommuneDepConnu " :

Function Test(Code$, Dep$)
Test = (Left(Code, 2) = Dep)
End Function

Extrait du code VBA Excel destiné à alimenter la base :

Option Explicit
Private DB As Database, RS As Recordset

Private Sub OuvreBase()
ChDir ThisWorkbook.Path
Set DB = OpenDatabase(ThisWorkbook.Sheets(1).Evaluate("Base"))
End Sub

Private Sub Test1()
MAJParam ActiveWorkbook.Sheets(1).Range("Localité1")
' Suite du code, à venir
End Sub

Private Sub MAJParam(Loc As Range)
OuvreBase
Set RS = DB.OpenRecordset("Param")
RS.Edit
RS!Localité = Loc
RS!Dép = Loc.Offset(2)
RS.Update
RS.Close
DB.Close
End Sub

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Private Sub Test3()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommuneDepConnu")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub- Masquer le texte des messages précédents -


- Afficher le texte des messages précédents -



Michel Gaboly
Le #4265301
Salut JièL

Merci pour ta réponse, mais je ne peux pas tout gérer dans Access : i l s'agit d'un dévelopement fait pour une
association entomologique.

J'ai fait sous Excel un ouil qui permet à des naturalistes de saisir de s observations de papillons.

J'ai ainsi récupéré une centaine de documents Excel, reçus de l'e nsemble des naturalistes participant au programme, à
partir desquels je dois alimenter par une moulinette une base Access, gé rée par le Museum National d'Histoire Naturelle.

Je vais essayer d'explorer comment fonctionnent les importations, et repo ser la quesion sur MPFA.

Merci encore


Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seul et
même prog.

Avec Access fait tout simplement un attachement de table excel (si cell e
ce est changeante), voire une importation (dans le cas d'infos figées )
dans une table existante ou dans une nouvelle table, et ensuite fais ce
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critère s te
telle ou telle autre c'est hyper simple à gérer avec les requêtes alors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nul le part)




--
Cordialement,

Michel Gaboly
www.gaboly.com

Michel Gaboly
Le #4265281
Bonjour,

Merci pour ta réponse, mais ton exemple correspond en gros à ma Sub T est2 :

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Cela ne résoud pas mon problème ;-((

Ce que je n'arrive pas à faire, c'est exploiter à partir de VBA Excel une requête Access faisant appel à une fonction,
"Test", écrite en VBA Access.

Que j'utilise

Set RS = DB.OpenRecordset(Q.Sql)

comme dans ma Sub ou

Set rs = q.OpenRecordset

comme dans la tienne, j'obtiens l'erreur 3085 (Fonction 'Test' non défi nie dans l'Expression).


Dans ton code, il y a également dans le module ADO l'exemple suivant,

Sub reqParam2()
Dim cat As New ADOX.Catalog
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
cat.ActiveConnection = CurrentProject.Connection
Set cmd = cat.Procedures("R_Clients_param").Command
cmd.Parameters("[maville]") = "Paris"
rst.Open cmd, , adOpenForwardOnly, adLockReadOnly, adCmdStoredProc
Do While Not rst.EOF
Debug.Print rst("société")
rst.MoveNext
Loop
rst.Close

mais j'ai une erreur de compilation ; il s'arrête sur

Dim cat As New ADOX.Catalog

avec "Type défini par l'utilisateur non défini".

NB - J'ai Access 2007

Cordialement,


Bonjour,

Exemple de requête paramétrée en DAO:

Sub ReqParamDAO()
Dim bd As DAO.Database
Dim rs As Recordset
Set bd = OpenDatabase(ActiveWorkbook.Path & "Access2000.mdb")
Set q = bd.QueryDefs("R_param_ville")
q.Parameters("nomville") = "paris"
Set rs = q.OpenRecordset
Do While Not rs.EOF
MsgBox rs!nom_client
rs.MoveNext
Loop
End Sub

http://boisgontierj.free.fr/fichiers/jb-excelaccess.zip

JB

On 30 mar, 00:52, JièL
Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seu l et
même prog.

Avec Access fait tout simplement un attachement de table excel (si cel le
ce est changeante), voire une importation (dans le cas d'infos figée s)
dans une table existante ou dans une nouvelle table, et ensuite fais c e
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critèr es te
telle ou telle autre c'est hyper simple à gérer avec les requête s alors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête u n
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nu lle part)

--
JièL / Jean-Louis GOUBERT
Là bas mieux qu'en face ;-)http://forums.offices.free.fr/
La NOUVELLE Faq Outlook est là :http://faq.outlook.free.fr/index.php
Les stats de CDO :http://faq.outlook.free.fr/cdo/




Bonsoir,
J'ai besoin d'alimenter une base Access à partir de documents Excel et
je rame, car je connais très mal Access.
En l'occurrence mon problème est le suivant : chaque document Excel
contient, entre autres choses, une localité et un département (so us
forme de texte, à cause des 01, 02, ... pour avoir toujours 2 carac tères).
La base Access contient une table avec le code INSEE des 36000 commun es
françaises. Les 2 premiers caractères du code INSEE correspondent au
département, comme un code postal. Je dois alimenter une autre tabl e
avec une douzaine de champs dont la localité et le code INSEE.
J'ai construit une requête, "ReqCommune" qui me liste toutes les
communes ayant pour nom la valeur d'une cellule nommée "Localité1 " dans
le document Excel. Par exemple, il y a 4 "Montréal", situés dans 4
départements différents. La voici :
SELECT LOCALITE.insee_comm, LOCALITE.NCC
FROM LOCALITE, Param
WHERE (((LOCALITE.NCC)=[Param].[Localité]));
"Param" est une table qui ne contient qu'un enregistrement, avec la
localité et le département, tels qu'ils apparaissent dans le docu ment
Excel.
"Param" est alimentée par la Sub "MAJParam", appelée par la Sub " Test1".
Une seconde requête, "ReqCommuneDepConnu", exploite le résultat d e la
première ("ReqCommune") et fait appel à une fonction, "Test" dont le
code est reproduit plus bas. Il s'agit d'éliminer les communes ayan t le
bon nom, mais situées dans un autre département :
SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));
A partir de la Sub "Test2", j'arrive à lancer la requête "ReqComm une",
sans difficulté particulière.
Par contre je suis incapable (Sub "Test3") de faire pareil avec
"ReqCommuneDepConnu" : j'obtiens le message (pas très surprenant
d'ailleurs) "Erreur 3085 Fonction 'Test' non définie dans l'Express ion".
J'ai voulu faire des essais avec
Q.Execute
ou
DB.Execute Q.Sql, dbFailOnError
sans succès ;-((((
Quelqu'un aurait-il une piste ?
Merci d'avance.
Extrait du code VBA Access (fonction utilisée par "ReqCommuneDepCon nu" :
Function Test(Code$, Dep$)
Test = (Left(Code, 2) = Dep)
End Function
Extrait du code VBA Excel destiné à alimenter la base :
Option Explicit
Private DB As Database, RS As Recordset
Private Sub OuvreBase()
ChDir ThisWorkbook.Path
Set DB = OpenDatabase(ThisWorkbook.Sheets(1).Evaluate("Base"))
End Sub
Private Sub Test1()
MAJParam ActiveWorkbook.Sheets(1).Range("Localité1")
' Suite du code, à venir
End Sub
Private Sub MAJParam(Loc As Range)
OuvreBase
Set RS = DB.OpenRecordset("Param")
RS.Edit
RS!Localité = Loc
RS!Dép = Loc.Offset(2)
RS.Update
RS.Close
DB.Close
End Sub
Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub
Private Sub Test3()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommuneDepConnu")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub- Masquer le texte des messages précédents -
- Afficher le texte des messages précédents -







--
Cordialement,

Michel Gaboly
www.gaboly.com



JB
Le #4263151
Les champs calculés dans les requêtes paramétrées ne doivent utilis er
que les fonctions standards d'Access si elles sont exécutées à partir
d'un autre logiciel.

Depart: Gauche([codePostal];2) ' fonctionne

Depart: Departement([codePostal]) ' ne fonctionne pas si exécuté
par un autre logiciel

JB

On 30 mar, 09:19, Michel Gaboly
Bonjour,

Merci pour ta réponse, mais ton exemple correspond en gros à ma Sub T est2 :

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Cela ne résoud pas mon problème ;-((

Ce que je n'arrive pas à faire, c'est exploiter à partir de VBA Excel une requête Access faisant appel à une fonction,
"Test", écrite en VBA Access.

Que j'utilise

Set RS = DB.OpenRecordset(Q.Sql)

comme dans ma Sub ou

Set rs = q.OpenRecordset

comme dans la tienne, j'obtiens l'erreur 3085 (Fonction 'Test' non défi nie dans l'Expression).

Dans ton code, il y a également dans le module ADO l'exemple suivant,

Sub reqParam2()
Dim cat As New ADOX.Catalog
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
cat.ActiveConnection = CurrentProject.Connection
Set cmd = cat.Procedures("R_Clients_param").Command
cmd.Parameters("[maville]") = "Paris"
rst.Open cmd, , adOpenForwardOnly, adLockReadOnly, adCmdStoredProc
Do While Not rst.EOF
Debug.Print rst("société")
rst.MoveNext
Loop
rst.Close

mais j'ai une erreur de compilation ; il s'arrête sur

Dim cat As New ADOX.Catalog

avec "Type défini par l'utilisateur non défini".

NB - J'ai Access 2007

Cordialement,






Bonjour,

Exemple de requête paramétrée en DAO:

Sub ReqParamDAO()
Dim bd As DAO.Database
Dim rs As Recordset
Set bd = OpenDatabase(ActiveWorkbook.Path & "Access2000.mdb")
Set q = bd.QueryDefs("R_param_ville")
q.Parameters("nomville") = "paris"
Set rs = q.OpenRecordset
Do While Not rs.EOF
MsgBox rs!nom_client
rs.MoveNext
Loop
End Sub

http://boisgontierj.free.fr/fichiers/jb-excelaccess.zip

JB

On 30 mar, 00:52, JièL
Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seu l et
même prog.

Avec Access fait tout simplement un attachement de table excel (si cel le
ce est changeante), voire une importation (dans le cas d'infos figée s)
dans une table existante ou dans une nouvelle table, et ensuite fais ce
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critèr es te
telle ou telle autre c'est hyper simple à gérer avec les requête s alors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nu lle part)

--
JièL / Jean-Louis GOUBERT
Là bas mieux qu'en face ;-)http://forums.offices.free.fr/
La NOUVELLE Faq Outlook est là :http://faq.outlook.free.fr/index.php
Les stats de CDO :http://faq.outlook.free.fr/cdo/




Bonsoir,
J'ai besoin d'alimenter une base Access à partir de documents Excel et
je rame, car je connais très mal Access.
En l'occurrence mon problème est le suivant : chaque document Excel
contient, entre autres choses, une localité et un département (so us
forme de texte, à cause des 01, 02, ... pour avoir toujours 2 carac tères).
La base Access contient une table avec le code INSEE des 36000 commun es
françaises. Les 2 premiers caractères du code INSEE correspondent au
département, comme un code postal. Je dois alimenter une autre table
avec une douzaine de champs dont la localité et le code INSEE.
J'ai construit une requête, "ReqCommune" qui me liste toutes les
communes ayant pour nom la valeur d'une cellule nommée "Localité1 " dans
le document Excel. Par exemple, il y a 4 "Montréal", situés dans 4
départements différents. La voici :
SELECT LOCALITE.insee_comm, LOCALITE.NCC
FROM LOCALITE, Param
WHERE (((LOCALITE.NCC)=[Param].[Localité]));
"Param" est une table qui ne contient qu'un enregistrement, avec la
localité et le département, tels qu'ils apparaissent dans le docu ment
Excel.
"Param" est alimentée par la Sub "MAJParam", appelée par la Sub " Test1".
Une seconde requête, "ReqCommuneDepConnu", exploite le résultat d e la
première ("ReqCommune") et fait appel à une fonction, "Test" dont le
code est reproduit plus bas. Il s'agit d'éliminer les communes ayan t le
bon nom, mais situées dans un autre département :
SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));
A partir de la Sub "Test2", j'arrive à lancer la requête "ReqComm une",
sans difficulté particulière.
Par contre je suis incapable (Sub "Test3") de faire pareil avec
"ReqCommuneDepConnu" : j'obtiens le message (pas très surprenant
d'ailleurs) "Erreur 3085 Fonction 'Test' non définie dans l'Express ion".
J'ai voulu faire des essais avec
Q.Execute
ou
DB.Execute Q.Sql, dbFailOnError
sans succès ;-((((
Quelqu'un aurait-il une piste ?
Merci d'avance.
Extrait du code VBA Access (fonction utilisée par "ReqCommuneDepCon nu" :
Function Test(Code$, Dep$)
Test = (Left(Code, 2) = Dep)
End Function
Extrait du code VBA Excel destiné à alimenter la base :
Option Explicit
Private DB As Database, RS As Recordset
Private Sub OuvreBase()
ChDir ThisWorkbook.Path
Set DB = OpenDatabase(ThisWorkbook.Sheets(1).Evaluate("Base"))
End Sub
Private Sub Test1()
MAJParam ActiveWorkbook.Sheets(1).Range("Localité1")
' Suite du code, à venir
End Sub
Private Sub MAJParam(Loc As Range)
OuvreBase
Set RS = DB.OpenRecordset("Param")
RS.Edit
RS!Localité = Loc
RS!Dép = Loc.Offset(2)
RS.Update
RS.Close
DB.Close
End Sub
Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub
Private Sub Test3()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommuneDepConnu")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub- Masquer le texte des messages précédents -
- Afficher le texte des messages précédents -




--
Cordialement,

Michel Gabolywww.gaboly.com- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -





Michel Gaboly
Le #4263101
Merci pour ta réponse, même si elle n'est pas encourageante ;-(((

Access me semble encore plus désagréable d'emploi qu'auparavant !

Les champs calculés dans les requêtes paramétrées ne doivent ut iliser
que les fonctions standards d'Access si elles sont exécutées à pa rtir
d'un autre logiciel.

Depart: Gauche([codePostal];2) ' fonctionne

Depart: Departement([codePostal]) ' ne fonctionne pas si exécuté
par un autre logiciel

JB

On 30 mar, 09:19, Michel Gaboly
Bonjour,

Merci pour ta réponse, mais ton exemple correspond en gros à ma Su b Test2 :

Private Sub Test2()
Dim Q As QueryDef, RS As Recordset
OuvreBase
Set Q = DB.QueryDefs("ReqCommune")
Set RS = DB.OpenRecordset(Q.Sql)
MsgBox RS!insee_comm
End Sub

Cela ne résoud pas mon problème ;-((




--
Cordialement,

Michel Gaboly
www.gaboly.com


JièL
Le #4315381
Bonjoir(c) Michel Gaboly

ok, je comprend, et je persiste à dire : récupère TOUTES les données dans
Access et ensuite tu fais les traitement qui vont bien.

Actuellement tu cherches à récupérer que ce qui t'intéresse dans les
classeurs XL, mais c'est lourd, lent et pas simple. Fait des moulinettes
d'importation (ou d'attachement, c'est le summum) et traite ensuite ce que
tu as importé ou attaché, c'est en ça que ce sera plus simple

NB : pense à compacter tes bases régulièrement, quand on importe et
supprime, Access ne récupère pas la place utilisé lors de l'import

--
JièL / Jean-Louis GOUBERT
Là bas mieux qu'en face ;-) http://forums.offices.free.fr/
La nouvelle FAQ Outlook est là : http://faq.outlook.free.fr/index.php
Les stats de CDO : http://faq.outlook.free.fr/cdo/

Le 30/03/2007 08:44 vous avez écrit ceci :
Salut JièL

Merci pour ta réponse, mais je ne peux pas tout gérer dans Access : il
s'agit d'un dévelopement fait pour une association entomologique.

J'ai fait sous Excel un ouil qui permet à des naturalistes de saisir des
observations de papillons.

J'ai ainsi récupéré une centaine de documents Excel, reçus de l'ensemble
des naturalistes participant au programme, à partir desquels je dois
alimenter par une moulinette une base Access, gérée par le Museum
National d'Histoire Naturelle.

Je vais essayer d'explorer comment fonctionnent les importations, et
reposer la quesion sur MPFA.

Merci encore


Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seul
et même prog.

Avec Access fait tout simplement un attachement de table excel (si
celle ce est changeante), voire une importation (dans le cas d'infos
figées) dans une table existante ou dans une nouvelle table, et
ensuite fais ce que tu as à faire directement dans Access, c'est bien
plus simple.

Une maj de table via des données d'une autre en fonction de critères
te telle ou telle autre c'est hyper simple à gérer avec les requêtes
alors que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nulle
part)







MichDenis
Le #4315241
Il y a déjà un bon moment, j'ai créé un petit exemple qui fait
ce que tu désires ... je n'ai pas eu l'occasion de la testé sous
office 2003.... mais tu pourrais peut être t'en inspirer !

(classeur et base de données comptoir.mdb
de microsoft à mettre dans le même répertoire)

http://cjoint.com/?eboxljPAN2




"Michel Gaboly" eq%
Salut JièL

Merci pour ta réponse, mais je ne peux pas tout gérer dans Access : il s'agit d'un dévelopement fait
pour une
association entomologique.

J'ai fait sous Excel un ouil qui permet à des naturalistes de saisir des observations de papillons.

J'ai ainsi récupéré une centaine de documents Excel, reçus de l'ensemble des naturalistes
participant au programme, à
partir desquels je dois alimenter par une moulinette une base Access, gérée par le Museum National
d'Histoire Naturelle.

Je vais essayer d'explorer comment fonctionnent les importations, et reposer la quesion sur MPFA.

Merci encore


Salut Michel

juste un conseil : arrête de te prendre la tête avec Excel, gère tout
dans Access !!!
Je sais, c'est pas ta tasse de thé, mais c'est si simple dans un seul et
même prog.

Avec Access fait tout simplement un attachement de table excel (si celle
ce est changeante), voire une importation (dans le cas d'infos figées)
dans une table existante ou dans une nouvelle table, et ensuite fais ce
que tu as à faire directement dans Access, c'est bien plus simple.

Une maj de table via des données d'une autre en fonction de critères te
telle ou telle autre c'est hyper simple à gérer avec les requêtes alors
que c'est ch*** comme tout avec du VBA

Si tu veux plus d'aide, je te conseille de poser ta question dans ce
sens sur le NG Access... et surtout ne leur dit pas que tu gère des
"bases de données" avec Excel, il vont se moquer ;-)))))))))))

Sans avoir testé je peut te dire que "WHERE
(((Test([ReqCommune]![insee_comm],[Param]![Dép]))=True));" ne peut
évidement pas fonctionner. Par contre, si tu met dans ta requête un
champ du genre "toto:gauche(Code; 2)" et que tu met ton critères
"[Param]![Dép]" sous ce dernier la ça devrait aller (sans les " nulle part)




--
Cordialement,

Michel Gaboly
www.gaboly.com

Publicité
Poster une réponse
Anonyme