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

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

2 réponses
Avatar
Michel Gaboly
Bonjour,

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

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

En l'occurrence mon probl=E8me est le suivant : chaque document Excel con=
tient, entre autres choses, une localit=E9 et un=20
d=E9partement (sous forme de texte, =E0 cause des 01, 02, ... pour avoir =
toujours 2 caract=E8res).

La base Access contient une table avec le code INSEE des 36000 communes f=
ran=E7aises. Les 2 premiers caract=E8res du code=20
INSEE correspondent au d=E9partement, comme un code postal. Je dois alime=
nter une autre table avec une douzaine de champs=20
dont la localit=E9 et le code INSEE.

J'ai construit une requ=EAte, "ReqCommune" qui me liste toutes les commun=
es ayant pour nom la valeur d'une cellule nomm=E9e=20
"Localit=E91" dans le document Excel. Par exemple, il y a 4 "Montr=E9al",=
situ=E9s dans 4 d=E9partements diff=E9rents. La voici :

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

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

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

Une seconde requ=EAte, "ReqCommuneDepConnu", exploite le r=E9sultat de la=
premi=E8re ("ReqCommune") et fait appel =E0 une=20
fonction, "Test" dont le code est reproduit plus bas. Il s'agit d'=E9limi=
ner les communes ayant le bon nom, mais situ=E9es=20
dans un autre d=E9partement :

SELECT ReqCommune.insee_comm, ReqCommune.NCC
FROM ReqCommune, Param
WHERE (((Test([ReqCommune]![insee_comm],[Param]![D=E9p]))=3DTrue));


A partir de la Sub "Test2", j'arrive =E0 lancer la requ=EAte "ReqCommune"=
, sans difficult=E9 particuli=E8re.

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

J'ai voulu faire des essais avec

Q.Execute

ou

DB.Execute Q.Sql, dbFailOnError

sans succ=E8s ;-((((


Quelqu'un aurait-il une piste ?

Merci d'avance.


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

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


Extrait du code VBA Excel destin=E9 =E0 alimenter la base :

Option Explicit
Private DB As Database, RS As Recordset

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

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

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

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

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


--=20
Cordialement,

Michel Gaboly
www.gaboly.com

2 réponses

Avatar
Gilbert
Bonjour,

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

--
Gilbert


"Michel Gaboly" a écrit dans le message de news:
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
Avatar
Michel Gaboly
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