Re: Lancer une requête Access depuis Excel en VBA

Le
Michel Gaboly
Bonjour,

Habitué du MPFE (le Newsgroup Excel), je connais bien Excel et VBA, mai=
s très mal Access.

J'ai besoin d'alimenter une base Access à partir de documents Excel et =
je rame ;-((

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
Gilbert
Le #6228121
Bonjour,

Question idiote, mais je la pose quand même:
As-tu testé cette requête directement dans Access?

--
Gilbert


"Michel Gaboly" uuH$
Bonjour,

Habitué du MPFE (le Newsgroup Excel), je connais bien Excel et VBA, mais
très mal Access.

J'ai besoin d'alimenter une base Access à partir de documents Excel et je
rame ;-((

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


--
Cordialement,

Michel Gaboly
www.gaboly.com
Michel Gaboly
Le #6228081
Bonjour,

La question n'a rien d'idiot ; il vaut toujours mieux vérifier les base s ;-))

Oui, j'ai testé, et cela marche !

Merci


Bonjour,

Question idiote, mais je la pose quand même:
As-tu testé cette requête directement dans Access?




--
Cordialement,

Michel Gaboly
www.gaboly.com

Publicité
Poster une réponse
Anonyme