OVH Cloud OVH Cloud

Lire une requête existanrte access depuis excel

4 réponses
Avatar
Opus
J'aimerais lire les données d'une requête déjà existante dans accès.

Pour cela, j'ai créé le début d'une SUB.

Dim DB As DAO.Database, Rst As DAO.Recordset
Dim BD As String, Requete As String

Set DB = DBEngine.Workspaces(0).OpenDatabase("C:\MaBase.mdb")


Et puis, que dois-je faire pour sélectionner la requête en question?

Si j'utilise ce qui suit, ça ne va pas (Snif)

With DB
Set Rst = .OpenRecordset("SELECT * FROM [MaRequete];")
End With

Pouvez-vous m'aider.

Merci à tous.

4 réponses

Avatar
Steph_D
Bonjour,

En adaptant la procédure suivante

' Nom de la base de données -- MesDATAS.mdb
' Requête SQL définie dans la macro
' Le classeur ici doit être dans le même dossier que la base d'access
' Référencer Microsoft ActiveX Data Objects 2.6 Library
' (menu Outils/Référence)


Sub ImporteMesLignes()

Dim MesDonneesAccess As ADODB.Recordset
Dim MaConnexionBase As String
Dim MonScript As String
Dim intColIndex As Integer
Dim MaDateDebut, MaDateFin As String

Application.ScreenUpdating = False
PathMyApplication = ActiveWorkbook.Path & ""
Set TargetRange = ActiveWorkbook.Sheets("Feuil1").Cells(1, 1)

' Crée la chaine de connexion. Nom de l'ADO, le chemin et la base de
' données
' 3.51 pour access95 et 97, 4.0 pour access 2000 etc.
MaConnexionBase = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source= " & PathMyApplication & "MesDatas.mdb;"

' Crée la requête SQL
MonScript = "select * from [Requête];"

' Crée l'objet Recordset et exécute la requête
Set MesDonneesAccess = New ADODB.Recordset
MesDonneesAccess.Open MonScript, MaConnexionBase, _
adLockReadOnly, adLockReadOnly, adCmdText

Application.StatusBar = "Lancement de la requête"

' On s'assure qu'il y a des enregistrements à récupérer
If Not MesDonneesAccess.EOF Then
' Mise en place des noms de champs comme entêtes de colonne
For intColIndex = 0 To MesDonneesAccess.Fields.Count - 1
TargetRange.Offset(0, intColIndex).Value = _
MesDonneesAccess.Fields(intColIndex).Name
Next
' Vide le contenu du jeu d'enregistrements dans la feuille
Application.StatusBar = "Extraction des enregistrements ..."
TargetRange.Offset(1, 0).CopyFromRecordset MesDonneesAccess
Nbrecords = Sheets("Feuil1").Range("A65536").End(-4162).Row - 1
MsgBox "Import de " & Nbrecords & " enregistrement(s) ..."
Else
MsgBox "Il n'y a aucun enregistrement correspondant.", _
vbInformation
End If

' Ferme le jeu d'enregistrements s'il est toujours ouvert ...
If CBool(MesDonneesAccess.State And adStateOpen) Then _
MesDonneesAccess.Close

Set MesDonneesAccess = Nothing

Application.StatusBar = ""

End Sub



Plus d'infos ici http://ericrenaud.free.fr

Steph D.
Avatar
Opus
Ca ne fonctionne pas.

Bien que des enregistrements existent dans la requête ACCESS,j'ai le message
"Il n'y a aucun enregistrement correspondant." dans EXCEL.

?

(re)snif.
Avatar
Steph_D
Mince, peut-être la version d'access, la location de la base ou du classeur
...

Vous pouvez visionner la macro originale ici sur
http://ericrenaud.free.fr/daoado.htm (utilisez le trigger sur la partie
gauche, partie ADO).

Un copier-coller de la procédure qui m'a bien aidée

Bon courage

Définition des éléments utilisés :
Nom de la base de données --> Clients.mdb
Table contenant les données à exporter vers Excel --> ListeClients
Champs de la table ListeClients --> Client, Rue, Adresse, CPVille
et Pays
Nom du classeur Excel --> Import données Access dans XL.xls
Feuille de calcul Excel recevant les données --> Données
La requête SQL utilisée --> SELECT ListeClients.* FROM ListeClients
(Ce qui correspond à l'extraction de tous les enregistrements de la
table ListeClients)

Sub ImporteDataAccess()

Dim rsData As ADODB.Recordset

Dim szConnect As String

Dim szSQL As String

Dim intColIndex As Integer


Application.ScreenUpdating = False

PathMyApplication = ActiveWorkbook.Path & ""


Set TargetRange = ActiveWorkbook.Sheets( "Données" ).Cells( 1 , 1 )


' Crée la chaine de connexion

szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source= " & PathMyApplication & "Clients.mdb;"


' Crée l'instruction SQL

szSQL = "SELECT ListeClients.* FROM ListeClients"


'Crée l'objet Recordset et exécute la requête

Set rsData = New ADODB.Recordset

rsData.Open szSQL, szConnect, adLockReadOnly, adLockReadOnly, adCmdText

Application.StatusBar = "Lancement de la requête SQL ..."


' On s'assure qu'il y a des enregistrements à récupérer ...

If Not rsData.EOF Then

' Mise en place des noms de champs comme entêtes de colonne

For intColIndex = 0 To rsData.Fields.Count - 1

TargetRange.Offset( 0 , intColIndex).Value rsData.Fields(intColIndex).Name

Next

' Vide le contenu du jeu d'enregistrements dans la feuille de
calcul Excel

Application.StatusBar = "Extraction des enregistrements ..."

TargetRange.Offset( 1 , 0 ).CopyFromRecordset rsData

Nbrecords = Sheets( "Données" ).Range( "A65536" ).End(-
4162 ).Row - 1

MsgBox "Import de " & Nbrecords & " enregistrement(s) ..."

Else

MsgBox "Il n'y a aucun enregistrement correspondant." ,
vbInformation

ActiveWorkbook.Close ( False )

End If

' Ferme le jeu d'enregistrements s'il est toujours ouvert ...

If CBool (rsData.State And adStateOpen) Then rsData.Close

Set rsData = Nothing

Application.StatusBar = ""

End Sub
Avatar
Opus
Et le pire, c'est que mes importations fonctionnent correctement avec les
tables...
Mais avec les requêtes: non!

Pfff



Mince, peut-être la version d'access, la location de la base ou du classeur
....

Vous pouvez visionner la macro originale ici sur
http://ericrenaud.free.fr/daoado.htm (utilisez le trigger sur la partie
gauche, partie ADO).

Un copier-coller de la procédure qui m'a bien aidée

Bon courage

Définition des éléments utilisés :
Nom de la base de données --> Clients.mdb
Table contenant les données à exporter vers Excel --> ListeClients
Champs de la table ListeClients --> Client, Rue, Adresse, CPVille
et Pays
Nom du classeur Excel --> Import données Access dans XL.xls
Feuille de calcul Excel recevant les données --> Données
La requête SQL utilisée --> SELECT ListeClients.* FROM ListeClients
(Ce qui correspond à l'extraction de tous les enregistrements de la
table ListeClients)

Sub ImporteDataAccess()

Dim rsData As ADODB.Recordset

Dim szConnect As String

Dim szSQL As String

Dim intColIndex As Integer


Application.ScreenUpdating = False

PathMyApplication = ActiveWorkbook.Path & ""


Set TargetRange = ActiveWorkbook.Sheets( "Données" ).Cells( 1 , 1 )


' Crée la chaine de connexion

szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source= " & PathMyApplication & "Clients.mdb;"


' Crée l'instruction SQL

szSQL = "SELECT ListeClients.* FROM ListeClients"


'Crée l'objet Recordset et exécute la requête

Set rsData = New ADODB.Recordset

rsData.Open szSQL, szConnect, adLockReadOnly, adLockReadOnly, adCmdText

Application.StatusBar = "Lancement de la requête SQL ..."


' On s'assure qu'il y a des enregistrements à récupérer ...

If Not rsData.EOF Then

' Mise en place des noms de champs comme entêtes de colonne

For intColIndex = 0 To rsData.Fields.Count - 1

TargetRange.Offset( 0 , intColIndex).Value > rsData.Fields(intColIndex).Name

Next

' Vide le contenu du jeu d'enregistrements dans la feuille de
calcul Excel

Application.StatusBar = "Extraction des enregistrements ..."

TargetRange.Offset( 1 , 0 ).CopyFromRecordset rsData

Nbrecords = Sheets( "Données" ).Range( "A65536" ).End(-
4162 ).Row - 1

MsgBox "Import de " & Nbrecords & " enregistrement(s) ..."

Else

MsgBox "Il n'y a aucun enregistrement correspondant." ,
vbInformation

ActiveWorkbook.Close ( False )

End If

' Ferme le jeu d'enregistrements s'il est toujours ouvert ...

If CBool (rsData.State And adStateOpen) Then rsData.Close

Set rsData = Nothing

Application.StatusBar = ""

End Sub