OVH Cloud OVH Cloud

requête Access pour VBA

11 réponses
Avatar
Laurent M
Bonjour, je développe une appli Excel - Access avec des liaisons VBA
Je souhaiterais, pour mes fonctions d'import - export VBA utiliser des
requêtes prédéfinies avec Access.
Est-ce possible d'appeler ces requêtes dans mon code?
Si oui comment? :)

Merci beaucoup !

10 réponses

1 2
Avatar
Patrick Fredin
Bonjour,

Je pense que ce bout de code devrait t'aider. Il faut utiliser la référence
à Microsoft ADO.

Dim adoCmd As ADODB.Command
Dim adoConn As ADODB.Connection
Dim adoRS As ADODB.Recordset

'Connexion à la base de données
'sAccessDB est une variable avec le nom et le chemin complet de la base
Access
Set adoConn = New ADODB.Connection
adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
sAccessDB & "; USER ID­min; PASSWORD=;"

Set adoCmd = New ADODB.Command
With adoCmd
.ActiveConnection = adoConn
'Nom de la requête
.CommandText = "qryPayrollImport"
.CommandType = adCmdStoredProc
'Paramètres définis dans la requête
.Parameters.Append .CreateParameter("pCycle", adVarChar,
adParamInput, 16, sCompSel)
.Parameters.Append .CreateParameter("pWorkDate", adDate,
adParamInput, , UpdateDate)
'Exécution de la requête
Set adoRS = adoCmd.Execute
End With

'Ferme la connexion
Set adoRS = Nothing
Set adoCmd = Nothing
Set adoConn = Nothing

Bon courage.

--
Patrick

"Laurent M" wrote in message
news:
Bonjour, je développe une appli Excel - Access avec des liaisons VBA
Je souhaiterais, pour mes fonctions d'import - export VBA utiliser des
requêtes prédéfinies avec Access.
Est-ce possible d'appeler ces requêtes dans mon code?
Si oui comment? :)

Merci beaucoup !


Avatar
Laurent M
Si je comprends bien ton code (ce qui n'est pas tout à fait sûr), on créé une
requête Access dotée de paramètres,et celle-ci est ensuite exécutée
mais est-ce que cela correspond à la transcriptioon vba d'une requête access?

Ce que je souhaite faire c'est de stocker mes requêtes dans Access puis de
les reutiliser dans mon code vba.




Bonjour,

Je pense que ce bout de code devrait t'aider. Il faut utiliser la référence
à Microsoft ADO.

Dim adoCmd As ADODB.Command
Dim adoConn As ADODB.Connection
Dim adoRS As ADODB.Recordset

'Connexion à la base de données
'sAccessDB est une variable avec le nom et le chemin complet de la base
Access
Set adoConn = New ADODB.Connection
adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
sAccessDB & "; USER ID­min; PASSWORD=;"

Set adoCmd = New ADODB.Command
With adoCmd
.ActiveConnection = adoConn
'Nom de la requête
.CommandText = "qryPayrollImport"
.CommandType = adCmdStoredProc
'Paramètres définis dans la requête
.Parameters.Append .CreateParameter("pCycle", adVarChar,
adParamInput, 16, sCompSel)
.Parameters.Append .CreateParameter("pWorkDate", adDate,
adParamInput, , UpdateDate)
'Exécution de la requête
Set adoRS = adoCmd.Execute
End With

'Ferme la connexion
Set adoRS = Nothing
Set adoCmd = Nothing
Set adoConn = Nothing

Bon courage.

--
Patrick

"Laurent M" wrote in message
news:
Bonjour, je développe une appli Excel - Access avec des liaisons VBA
Je souhaiterais, pour mes fonctions d'import - export VBA utiliser des
requêtes prédéfinies avec Access.
Est-ce possible d'appeler ces requêtes dans mon code?
Si oui comment? :)

Merci beaucoup !







Avatar
anomymousA
bonjour,

Faire une référence dans le menu Outils/Références à Microsoft Access 9.0
object Library.

Puis écrire une procédure suivante

Dim appAccess As Access.Application, nombase As String
Dim rs As Recordset,TABNOMREQUETE(1 to 5) as string

'on inhibe le rafraichissement de l'écran

Application.ScreenUpdating = False

'Crée une nouvelle instance de Microsoft Access.

Set appAccess = CreateObject("Access.Application.9")

'Ouvre la base de données dans la fenêtre Microsoft Access.

appAccess.OpenCurrentDatabase nombase 'nombase doit être le niom complet de
ta base Access

déclarer dans un tableau p.e le nom de tes requetes stockées dans ta base
Access
pour permettre uen boucle au cas où. C'est possible aussi par for each next
in collection des requêtes ( écriture cf VBA sous Access puisque tu as acces
au modele d'objet Access en raison des déclarations précédentes)

TABNOMREQUETE(1) = "Nom Requete1"
TABNOMREQUETE(2) = "Nom Requete2"
TABNOMREQUETE(3) = "Nom Requete3"
TABNOMREQUETE(4) = "Nom Requete4"
TABNOMREQUETE(5) = "Nom Requete5"

For J = 1 To 5

Set rs = appAccess.CurrentDb.OpenRecordset(TABNOMREQUETE(J), ,
dbReadOnly)

If rs.BOF = True Then 'on teste s'il existe au moins un enregistrement
MsgBox " Il n'y a aucune données dans la requete. Le programme va
être arrêté"
rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
Exit Sub

else
rs.MoveFirst

Do
'ici tu écris le code pour traiter les enregistrements. Tu fais ce que tu
veux avec.tu n'es pas obligé de faire une lecture par enregistrement.C'est un
exemple Tu fais ce que tu veux avec un objet recordset dans la mesure des
choses autorisées dans ce cas.

rs.MoveNext

Loop Until rs.EOF = True

end if

next

'voila , c'est fini on reset les variables, on ferme Access et on plie.

rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
End Sub

A+


Si je comprends bien ton code (ce qui n'est pas tout à fait sûr), on créé une
requête Access dotée de paramètres,et celle-ci est ensuite exécutée
mais est-ce que cela correspond à la transcriptioon vba d'une requête access?

Ce que je souhaite faire c'est de stocker mes requêtes dans Access puis de
les reutiliser dans mon code vba.




Bonjour,

Je pense que ce bout de code devrait t'aider. Il faut utiliser la référence
à Microsoft ADO.

Dim adoCmd As ADODB.Command
Dim adoConn As ADODB.Connection
Dim adoRS As ADODB.Recordset

'Connexion à la base de données
'sAccessDB est une variable avec le nom et le chemin complet de la base
Access
Set adoConn = New ADODB.Connection
adoConn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &
sAccessDB & "; USER ID­min; PASSWORD=;"

Set adoCmd = New ADODB.Command
With adoCmd
.ActiveConnection = adoConn
'Nom de la requête
.CommandText = "qryPayrollImport"
.CommandType = adCmdStoredProc
'Paramètres définis dans la requête
.Parameters.Append .CreateParameter("pCycle", adVarChar,
adParamInput, 16, sCompSel)
.Parameters.Append .CreateParameter("pWorkDate", adDate,
adParamInput, , UpdateDate)
'Exécution de la requête
Set adoRS = adoCmd.Execute
End With

'Ferme la connexion
Set adoRS = Nothing
Set adoCmd = Nothing
Set adoConn = Nothing

Bon courage.

--
Patrick

"Laurent M" wrote in message
news:
Bonjour, je développe une appli Excel - Access avec des liaisons VBA
Je souhaiterais, pour mes fonctions d'import - export VBA utiliser des
requêtes prédéfinies avec Access.
Est-ce possible d'appeler ces requêtes dans mon code?
Si oui comment? :)

Merci beaucoup !









Avatar
Laurent M
J'ai testé ton code mais la ligne :

Set appAccess = CreateObject("Access.Application.9")

retourne l'erreur : "un composant activeX ne peut créer d'objet"

Je ne sais que faire !







bonjour,

Faire une référence dans le menu Outils/Références à Microsoft Access 9.0
object Library.

Puis écrire une procédure suivante

Dim appAccess As Access.Application, nombase As String
Dim rs As Recordset,TABNOMREQUETE(1 to 5) as string

'on inhibe le rafraichissement de l'écran

Application.ScreenUpdating = False

'Crée une nouvelle instance de Microsoft Access.

Set appAccess = CreateObject("Access.Application.9")

'Ouvre la base de données dans la fenêtre Microsoft Access.

appAccess.OpenCurrentDatabase nombase 'nombase doit être le niom complet de
ta base Access

déclarer dans un tableau p.e le nom de tes requetes stockées dans ta base
Access
pour permettre uen boucle au cas où. C'est possible aussi par for each next
in collection des requêtes ( écriture cf VBA sous Access puisque tu as acces
au modele d'objet Access en raison des déclarations précédentes)

TABNOMREQUETE(1) = "Nom Requete1"
TABNOMREQUETE(2) = "Nom Requete2"
TABNOMREQUETE(3) = "Nom Requete3"
TABNOMREQUETE(4) = "Nom Requete4"
TABNOMREQUETE(5) = "Nom Requete5"

For J = 1 To 5

Set rs = appAccess.CurrentDb.OpenRecordset(TABNOMREQUETE(J), ,
dbReadOnly)

If rs.BOF = True Then 'on teste s'il existe au moins un enregistrement
MsgBox " Il n'y a aucune données dans la requete. Le programme va
être arrêté"
rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
Exit Sub

else
rs.MoveFirst

Do
'ici tu écris le code pour traiter les enregistrements. Tu fais ce que tu
veux avec.tu n'es pas obligé de faire une lecture par enregistrement.C'est un
exemple Tu fais ce que tu veux avec un objet recordset dans la mesure des
choses autorisées dans ce cas.

rs.MoveNext

Loop Until rs.EOF = True

end if

next

'voila , c'est fini on reset les variables, on ferme Access et on plie.

rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
End Sub

A+


Avatar
anonymousA
re,

as-tu créé ta référence à la bibilothèque d'objet Access.
Par ailleurs, Quel Access as-tu ,2000,2002 , autre car de mémoire la
bibilothèque Access Library 9.0 correspond à Access 2000

A+

"Laurent M" a écrit dans le message de
news:
J'ai testé ton code mais la ligne :

Set appAccess = CreateObject("Access.Application.9")

retourne l'erreur : "un composant activeX ne peut créer d'objet"

Je ne sais que faire !







bonjour,

Faire une référence dans le menu Outils/Références à Microsoft Access
9.0


object Library.

Puis écrire une procédure suivante

Dim appAccess As Access.Application, nombase As String
Dim rs As Recordset,TABNOMREQUETE(1 to 5) as string

'on inhibe le rafraichissement de l'écran

Application.ScreenUpdating = False

'Crée une nouvelle instance de Microsoft Access.

Set appAccess = CreateObject("Access.Application.9")

'Ouvre la base de données dans la fenêtre Microsoft Access.

appAccess.OpenCurrentDatabase nombase 'nombase doit être le niom complet
de


ta base Access

déclarer dans un tableau p.e le nom de tes requetes stockées dans ta
base


Access
pour permettre uen boucle au cas où. C'est possible aussi par for each
next


in collection des requêtes ( écriture cf VBA sous Access puisque tu as
acces


au modele d'objet Access en raison des déclarations précédentes)

TABNOMREQUETE(1) = "Nom Requete1"
TABNOMREQUETE(2) = "Nom Requete2"
TABNOMREQUETE(3) = "Nom Requete3"
TABNOMREQUETE(4) = "Nom Requete4"
TABNOMREQUETE(5) = "Nom Requete5"

For J = 1 To 5

Set rs = appAccess.CurrentDb.OpenRecordset(TABNOMREQUETE(J), ,
dbReadOnly)

If rs.BOF = True Then 'on teste s'il existe au moins un
enregistrement


MsgBox " Il n'y a aucune données dans la requete. Le programme
va


être arrêté"
rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
Exit Sub

else
rs.MoveFirst

Do
'ici tu écris le code pour traiter les enregistrements. Tu fais ce que
tu


veux avec.tu n'es pas obligé de faire une lecture par
enregistrement.C'est un


exemple Tu fais ce que tu veux avec un objet recordset dans la mesure
des


choses autorisées dans ce cas.

rs.MoveNext

Loop Until rs.EOF = True

end if

next

'voila , c'est fini on reset les variables, on ferme Access et on plie.

rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
End Sub

A+





Avatar
Laurent M
D'accord j'ai compris d'où vient l'erreur. J'ai access 2003 et javais ajouté
la bibliothèque Microsoft Access 11.0, j'ai donc changé ça

J'ai à présent une nouvelle erreur sur cette ligne :

Set rs = appAccess.CurrentDb.OpenRecordset(MyQuery, , dbReadOnly)

Je reçois l'erreur : "incompatibilité de type"
MyQuery est une string portant le nom de ma requête enregistrée dans Access





re,

as-tu créé ta référence à la bibilothèque d'objet Access.
Par ailleurs, Quel Access as-tu ,2000,2002 , autre car de mémoire la
bibilothèque Access Library 9.0 correspond à Access 2000

A+

"Laurent M" a écrit dans le message de
news:
J'ai testé ton code mais la ligne :

Set appAccess = CreateObject("Access.Application.9")

retourne l'erreur : "un composant activeX ne peut créer d'objet"

Je ne sais que faire !







bonjour,

Faire une référence dans le menu Outils/Références à Microsoft Access
9.0


object Library.

Puis écrire une procédure suivante

Dim appAccess As Access.Application, nombase As String
Dim rs As Recordset,TABNOMREQUETE(1 to 5) as string

'on inhibe le rafraichissement de l'écran

Application.ScreenUpdating = False

'Crée une nouvelle instance de Microsoft Access.

Set appAccess = CreateObject("Access.Application.9")

'Ouvre la base de données dans la fenêtre Microsoft Access.

appAccess.OpenCurrentDatabase nombase 'nombase doit être le niom complet
de


ta base Access

déclarer dans un tableau p.e le nom de tes requetes stockées dans ta
base


Access
pour permettre uen boucle au cas où. C'est possible aussi par for each
next


in collection des requêtes ( écriture cf VBA sous Access puisque tu as
acces


au modele d'objet Access en raison des déclarations précédentes)

TABNOMREQUETE(1) = "Nom Requete1"
TABNOMREQUETE(2) = "Nom Requete2"
TABNOMREQUETE(3) = "Nom Requete3"
TABNOMREQUETE(4) = "Nom Requete4"
TABNOMREQUETE(5) = "Nom Requete5"

For J = 1 To 5

Set rs = appAccess.CurrentDb.OpenRecordset(TABNOMREQUETE(J), ,
dbReadOnly)

If rs.BOF = True Then 'on teste s'il existe au moins un
enregistrement


MsgBox " Il n'y a aucune données dans la requete. Le programme
va


être arrêté"
rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
Exit Sub

else
rs.MoveFirst

Do
'ici tu écris le code pour traiter les enregistrements. Tu fais ce que
tu


veux avec.tu n'es pas obligé de faire une lecture par
enregistrement.C'est un


exemple Tu fais ce que tu veux avec un objet recordset dans la mesure
des


choses autorisées dans ce cas.

rs.MoveNext

Loop Until rs.EOF = True

end if

next

'voila , c'est fini on reset les variables, on ferme Access et on plie.

rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
End Sub

A+










Avatar
Starwing
Bonsoir,

De mémoire il faut mettre MyQuery entre " "

Set rs = appAccess.CurrentDb.OpenRecordset("MyQuery", , dbReadOnly)
--
Au plaisir de vous revoir ...
Visitez >> http://www.excelabo.net
Le merveilleux site de Misange
Starwing

--
Avatar
anonymousA
re,

peux-tu mettre l'ensemble de la procédure, parceque là pour l'instant je
ne vois pas.
Merci

A+

D'accord j'ai compris d'où vient l'erreur. J'ai access 2003 et javais ajouté
la bibliothèque Microsoft Access 11.0, j'ai donc changé ça

J'ai à présent une nouvelle erreur sur cette ligne :

Set rs = appAccess.CurrentDb.OpenRecordset(MyQuery, , dbReadOnly)

Je reçois l'erreur : "incompatibilité de type"
MyQuery est une string portant le nom de ma requête enregistrée dans Access






re,

as-tu créé ta référence à la bibilothèque d'objet Access.
Par ailleurs, Quel Access as-tu ,2000,2002 , autre car de mémoire la
bibilothèque Access Library 9.0 correspond à Access 2000

A+

"Laurent M" a écrit dans le message de
news:

J'ai testé ton code mais la ligne :

Set appAccess = CreateObject("Access.Application.9")

retourne l'erreur : "un composant activeX ne peut créer d'objet"

Je ne sais que faire !








bonjour,

Faire une référence dans le menu Outils/Références à Microsoft Access



9.0

object Library.

Puis écrire une procédure suivante

Dim appAccess As Access.Application, nombase As String
Dim rs As Recordset,TABNOMREQUETE(1 to 5) as string

'on inhibe le rafraichissement de l'écran

Application.ScreenUpdating = False

'Crée une nouvelle instance de Microsoft Access.

Set appAccess = CreateObject("Access.Application.9")

'Ouvre la base de données dans la fenêtre Microsoft Access.

appAccess.OpenCurrentDatabase nombase 'nombase doit être le niom complet



de

ta base Access

déclarer dans un tableau p.e le nom de tes requetes stockées dans ta



base

Access
pour permettre uen boucle au cas où. C'est possible aussi par for each



next

in collection des requêtes ( écriture cf VBA sous Access puisque tu as



acces

au modele d'objet Access en raison des déclarations précédentes)

TABNOMREQUETE(1) = "Nom Requete1"
TABNOMREQUETE(2) = "Nom Requete2"
TABNOMREQUETE(3) = "Nom Requete3"
TABNOMREQUETE(4) = "Nom Requete4"
TABNOMREQUETE(5) = "Nom Requete5"

For J = 1 To 5

Set rs = appAccess.CurrentDb.OpenRecordset(TABNOMREQUETE(J), ,
dbReadOnly)

If rs.BOF = True Then 'on teste s'il existe au moins un



enregistrement

MsgBox " Il n'y a aucune données dans la requete. Le programme



va

être arrêté"
rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
Exit Sub

else
rs.MoveFirst

Do
'ici tu écris le code pour traiter les enregistrements. Tu fais ce que



tu

veux avec.tu n'es pas obligé de faire une lecture par



enregistrement.C'est un

exemple Tu fais ce que tu veux avec un objet recordset dans la mesure



des

choses autorisées dans ce cas.

rs.MoveNext

Loop Until rs.EOF = True

end if

next

'voila , c'est fini on reset les variables, on ferme Access et on plie.

rs.Close
Set rs = Nothing
With appAccess
.CloseCurrentDatabase
.Quit
End With
End Sub

A+











Avatar
Laurent M
J'ai poursuivi mes recherches et il semblerait que ce que je recherche
s'articule autour des querydefs

Qu'en pensez-vous?
Avatar
anonymousA
J'ai poursuivi mes recherches et il semblerait que ce que je recherche
s'articule autour des querydefs

Qu'en pensez-vous?
je pense que ce que tu cherches , si j'ai bien compris, c'est à activer

des requetes spécifiques dans une base ACCESSS et ce depuis Excel.Si
c'est l'ensemble des requêtes contenues dans la base que tu dois
actionner, alors il peut être utile de parcourir exhaustivement la
collection QueryDefs ( à verfier car il ya un petit moment que je n'ai
pas ecrit du VBA en ACCESS) par une méthode for each next comme d'hab et
auquel cas , il n'est + necessaire de nommer les requetes.
Si tu veux n'en prendre qu'un certain nombre, il faudra bien les nommer
ou les discriminer dans la collection( et comment faire autrement que
par leur nom dans la collection QueryDefs parceque par le N° d'index ,
bonjour l'angoisse !!) et on revient à la demande initiale.

Donc en synthèse, ta proposition n'est ni bonne ni mauvaise. Elle est à
adapter à la réalité de ton problème et il n'y a que toi pour en mesurer
la nature.

A+

1 2