[VBA/SQL] communication Excel<-->Access
Résolu/Fermé
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
-
27 oct. 2008 à 10:16
YATA - 9 sept. 2009 à 10:51
YATA - 9 sept. 2009 à 10:51
A voir également:
- [VBA/SQL] communication Excel<-->Access
- Liste déroulante excel - Guide
- Si et excel - Guide
- Word et excel gratuit - Guide
- Déplacer une colonne excel - Guide
- Excel compter cellule couleur sans vba - Guide
16 réponses
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
27 oct. 2008 à 14:33
27 oct. 2008 à 14:33
La méthode de connexion ADO est la plus simple pour communiquer avec une base Access, et on peut difficilement s'en passer.
L'exemple sur le lien demande quelques connaissances en programmation.
Voilà un exemple pour ce connecter à une base Access. Il faut créer un module, le nommer ModBdd et coller le code ci dessous dans le module :
N'hésite pas à revenir pour avoir des explication.
;o)
L'exemple sur le lien demande quelques connaissances en programmation.
Voilà un exemple pour ce connecter à une base Access. Il faut créer un module, le nommer ModBdd et coller le code ci dessous dans le module :
'--------------------------------------------------------------------------------------- ' Module : ModuleBdD ' Author : Polux ' Date : 27/10/2008 ' Référence : /!\ DECLARER DANS LES REFERENCES : Microsoft ActiveX Data Object '--------------------------------------------------------------------------------------- 'Obligation de déclaration des variables. Option Explicit '/////////////////////////////////' '// Variables globales du module '/////////////////////////////////' Private CmdSql As ADODB.Command Private NbRs As Long Public cnx As ADODB.Connection Private rs As ADODB.Recordset '////////////////////////////////' '// Constantes à modifier selon le '// le cas d'utilisation '///////////////////////////////' Public Const bdd = "C:\ma_base.mdb" 'Private Const pw = "pwd" 'Private Const user = "user" '////////////////////////////////////// '// Accesseurs des variables globales '////////////////////////////////////// 'procédure qui stocke le nombre d'enregistrement dans le recordset Public Sub setNbRs(ByVal nb As Integer) NbRs = nb End Sub 'fonction qui retourne le nombre d'enregistrement dans le recordset Public Function getNbRs() As Long getNbRs = NbRs End Function 'fonction qui retourne le recordset Public Function getRs() As ADODB.Recordset Set getRs = rs End Function 'fonction qui retourne la connexion Public Function getAdoCnx() As ADODB.Connection getAdoCnx = AdoCnx End Function 'fonction qui retourne le chemin de la base de données Public Function getBdd() As String getBdd = bdd End Function '////////////////////////////////// '// Méthodes du module '////////////////////////////////// 'procédure de connexion à la base de donnée Public Sub ConnectBdd() Set cnx = New ADODB.Connection cnx.CursorLocation = adUseServer 'Définition du pilote de connexion cnx.Provider = "Microsoft.Jet.OLEDB.4.0" 'Définition de la chaîne de connexion cnx.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & bdd & ";Persist Security Info=False;" cnx.ConnectionString = cnx.ConnectionString 'Ouverture de la base de données cnx.Open End Sub 'fonction qui retourne un booléen. 'Paramètres entrées : la requête, l'objet recordset 'Passe la requête à la base de données et récupère le résultat dans le recordset Public Function OpenRecordset(ByVal requete As String, ByRef rs As ADODB.Recordset) As Boolean On Error Resume Next On Error Resume Next rs.Open requete, ModuleBdD.cnx, , , adCmdText 'passage de la requête If Err > 0 Then 'en cas d'erreur la fonction retourne Faux et on sort de la fonction OpenRecordset = False Exit Function End If rs.MoveFirst 'la connexion a réussi, on se place sur le 1er enregistrement NbRs = rs.RecordCount 'on compte le nombre de ligne retournée OpenRecordset = True 'la fonction retourne Vrai End Function 'fonctions Suivant, Précédent, Premier, Dernier qui retourne un booléen. 'Paramètre entrée : l'objet recordset 'Fonctions qui permettent de parcourir les enregistrements d'un recordset Public Function RSLireSuivant(ByRef rs As ADODB.Recordset) As Boolean On Error Resume Next rs.MoveNext If rs.EOF Then RSLireSuivant = False Exit Function End If If Err <> 0 Then RSLireSuivant = False MsgBox Err.Numbre & ": " & Err.Description Exit Function End If RSLireSuivant = True End Function Public Function RSLirePrecedent(ByRef rs As ADODB.Recordset) As Boolean On Error Resume Next rs.MovePrevious If rs.BOF Then RSLirePrecedent = False Exit Function End If If Err <> 0 Then RSLirePrecedent = False Exit Function End If RSLirePrecedent = True End Function Public Function RSLirePremier(ByRef rs As ADODB.Recordset) As Boolean On Error Resume Next rs.MoveFirst If Err <> 0 Then RSLirePremier = False Exit Function End If RSLirePremier = True End Function Public Function RSLireDernier(ByRef rs As ADODB.Recordset) As Boolean On Error Resume Next rs.MoveLast If Err <> 0 Then RSLireDernier = False MsgBox Err.Number & " : " & Err.Description Exit Function End If RSLireDernier = True End Function 'procédure qui ferme la connexion à la base de données Public Sub CloseBdd() AdoCnx.Close End Sub 'procédure qui ferme le recordset Public Sub CloseRs() rs.Close End Sub
N'hésite pas à revenir pour avoir des explication.
;o)
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 13:41
27 oct. 2008 à 13:41
je me permet de m'auto monter dans le classement...
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
27 oct. 2008 à 14:05
27 oct. 2008 à 14:05
Bonjour,
As-tu déjà une connexion avec Access ?
Peux-tu dire plus explicitement ce que tu n'arrives pas à faire ?
Merci.
;o)
As-tu déjà une connexion avec Access ?
Peux-tu dire plus explicitement ce que tu n'arrives pas à faire ?
Merci.
;o)
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 14:50
27 oct. 2008 à 14:50
merci !
rien de tel qu'un code bien commenté !!! j'ai cependant quelques questions.
qu'est que c'est exactement le recordSet ? je vois ça comme le résulat d'une requête sous forme de tableau. Me trompe-je ?
y à t'il un RecordSet par requête ?
cette méthode permet d'utiliser une BD dans excel, mais comment fait on pour utiliser le contenu d'une cellule Excel comme critère de sélection dans une requete SQL?
y a-t-il un moyen d'extraire le contenu d'une cellule et de l'écrire à la suite du WHERE dans la requète d'Access ?
ou peut on carément écrire du SQL dans une Sub ou fuction VBA ?
je ne suis pas sûre d'être très claire ...
rien de tel qu'un code bien commenté !!! j'ai cependant quelques questions.
qu'est que c'est exactement le recordSet ? je vois ça comme le résulat d'une requête sous forme de tableau. Me trompe-je ?
y à t'il un RecordSet par requête ?
cette méthode permet d'utiliser une BD dans excel, mais comment fait on pour utiliser le contenu d'une cellule Excel comme critère de sélection dans une requete SQL?
y a-t-il un moyen d'extraire le contenu d'une cellule et de l'écrire à la suite du WHERE dans la requète d'Access ?
ou peut on carément écrire du SQL dans une Sub ou fuction VBA ?
je ne suis pas sûre d'être très claire ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
27 oct. 2008 à 15:15
27 oct. 2008 à 15:15
Un recordset contient effectivement le résultat d'une requête sous forme de tableau.
Il faut donc un recordset par requête passer à la base de données.
On peut utiliser une variable d'un fichier Excel (le contenu d'une cellule) comme critère de choix dans une requête SQL. Pour cela, on écrit la requête en utilisant le code VBA.
Par exemple, en utilisant, le code passé ci dessus on peut faire :
- Dans un module de UserForm ou autre
J'espère que c'est clair !!! pas sûr ...
N'hésites pas à demander des explications.
;o)
Il faut donc un recordset par requête passer à la base de données.
On peut utiliser une variable d'un fichier Excel (le contenu d'une cellule) comme critère de choix dans une requête SQL. Pour cela, on écrit la requête en utilisant le code VBA.
Par exemple, en utilisant, le code passé ci dessus on peut faire :
- Dans un module de UserForm ou autre
Sub AfficheRequete() Dim oRs As ADODB.Recordset Dim Query As String Dim ok As Boolean Dim i As Long 'Construction de la requête Query = "Select * From MaTable Where mon_champ = '" & Worksheets(1).Range("C10").Value & " ' " 'Création de l'objet recordset Set oRs = New ADODB.Recordset 'Numéro de la première ligne pour l'affichage des résultats i = 2 ' ' On passe la requête à la base. Si le résultat est True on commence la lecture du recordset If ModBdd.OpenRecordset(Query, oRs) = True Then 'On lit le premier enregistrement du recordset ok = ModBdd.LirePremier(oRs) 'Tant que LireSuivant est True on affiche le résultat While ok = True Worksheets(2).Range("A" & i).Value = oRs.Fields(0) ' 1er champ de l'enregistrement Bdd en cours Worksheets(2).Range("B" & i).Value = oRs.Fields(1) ' 2ème champ de l'enregistrement Bdd en cours Worksheets(2).Range("C" & i).Value = oRs.Fields(2) ' 3ème champ de l'enregistrement Bdd en cours ' etc pour chaque champ de la table i = i + 1 'on ajoute une ligne pour afficher la ligne suivante ok = ModBdd.LireSuivant(oRs) 'On passe à la ligne suivant Wend End If End Sub
J'espère que c'est clair !!! pas sûr ...
N'hésites pas à demander des explications.
;o)
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
27 oct. 2008 à 15:41
27 oct. 2008 à 15:41
Si la requête existe déjà sous Access, elle se présente sous forme de table. Il suffit de faire :
Query = "Select * From requête1" 'Avec une clause Where éventuellement
ok = ModBdd.OpenRecordset(Query, oRs)
;o)
Query = "Select * From requête1" 'Avec une clause Where éventuellement
ok = ModBdd.OpenRecordset(Query, oRs)
;o)
Dsl de faire remonter se topic !
je suis tombé dessur par hazard
Je tiens à remercier polux pour son aide et le temps que je vais gagner dans mon travail !
encore merci
je suis tombé dessur par hazard
Je tiens à remercier polux pour son aide et le temps que je vais gagner dans mon travail !
encore merci
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 11:55
27 oct. 2008 à 11:55
ça n'a pas l'air de vous inspirer ...
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 14:13
27 oct. 2008 à 14:13
En fait j'ai trouvé un tuto sur la communication entre Acces et Excel dans lequel est décrit une méthode par plateforme ADO. voici le lien:
https://cafeine.developpez.com/access/tutoriel/excel/#LVII
https://cafeine.developpez.com/access/tutoriel/excel/#LVII
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 14:14
27 oct. 2008 à 14:14
le truc c'est que ça m'a l'air bien compliqué !!!
j'espérait qu'il existe queque chose de plus pratique (ou du moins facile)...
j'espérait qu'il existe queque chose de plus pratique (ou du moins facile)...
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 14:15
27 oct. 2008 à 14:15
et concernant la connection avec access : non je l'ai pas ...
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 15:29
27 oct. 2008 à 15:29
ça m'a l'air pas mal du tout ...
et si j'ai déjà des requêtes qui existent dans ma BD Access, puis-je les appeler directement dans ma function VBA, ou dois-je obligatoirement réécrire le code SQL dans la dite function ?
un truc du genre:
Query = Modbbd.requete1; ?
et si j'ai déjà des requêtes qui existent dans ma BD Access, puis-je les appeler directement dans ma function VBA, ou dois-je obligatoirement réécrire le code SQL dans la dite function ?
un truc du genre:
Query = Modbbd.requete1; ?
lalilu
Messages postés
35
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
17 décembre 2009
1
27 oct. 2008 à 15:43
27 oct. 2008 à 15:43
Formidable !
je devrais pouvoir m'en sortir maintenant ...
merci pour ton aide Polux31 !
je devrais pouvoir m'en sortir maintenant ...
merci pour ton aide Polux31 !
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
27 oct. 2008 à 15:45
27 oct. 2008 à 15:45
De rien, je le fais avec plaisir.
Bonne continuation
;o)
PS : N'oublie pas de mettre en résolu et n'hésite à revenir si problème.
Bonne continuation
;o)
PS : N'oublie pas de mettre en résolu et n'hésite à revenir si problème.
DarkAurora
Messages postés
417
Date d'inscription
lundi 26 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2013
27
25 mai 2009 à 15:14
25 mai 2009 à 15:14
j'ai un autre problème que celui ci
j'aimerais grâce à recordset sélectionné tout une colonne ( ce qui je crois est fait ) mais ensuite je souhaite envoyé ces données dans une requête sous access que j'ai crée
voici mon code :
Private Sub pointeur_Click()
Dim valeur As String
Dim truc As DAO.Recordset
Dim requete As String
valeur = pointeur.Value
If (valeur = "<<TOUS>>") Then
requete = "SELECT * FROM [R_effectif];"
DoCmd.RunSQL requete
End If
End Sub
comme avec runsql on ne peut pas faire sélection on doit utiliser recordset le problème c'est que je ne sais pas utiliser recordset pour faire ce que je veux
j'aimerais grâce à recordset sélectionné tout une colonne ( ce qui je crois est fait ) mais ensuite je souhaite envoyé ces données dans une requête sous access que j'ai crée
voici mon code :
Private Sub pointeur_Click()
Dim valeur As String
Dim truc As DAO.Recordset
Dim requete As String
valeur = pointeur.Value
If (valeur = "<<TOUS>>") Then
requete = "SELECT * FROM [R_effectif];"
DoCmd.RunSQL requete
End If
End Sub
comme avec runsql on ne peut pas faire sélection on doit utiliser recordset le problème c'est que je ne sais pas utiliser recordset pour faire ce que je veux
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
25 mai 2009 à 16:06
25 mai 2009 à 16:06
Bonjour,
Voilà un exemple pour utiliser un recordset avec un objet DAO:
;o)
Voilà un exemple pour utiliser un recordset avec un objet DAO:
Sub OpenRecordset () Dim oDb As DAO.Database, oRs As DAO.Recordset Dim sQuery As String ' Ouverture de la base de données Set oDb = DBEngine.OpenDatabase ("c:\mabase.mdb") 'mettre le chemin d'accès de la base ou dans Access mettre Set oDb = CurrentDb sQuery = "Select champ1, champ2 From matable" ' Ouverture du recordset Set oRs = db.OpenRecordset (sQuery, dbOpenForwardOnly, dbReadOnly) 'Lecture du recordset While Not oRs.EOF msgBox oRs.Fields(0) & " " & oRs.Fields(1) oRs.MoveNext Wend ' Fermeture du Recordset oRs.Close oDb.Close End Sub
;o)