web-dev-qa-db-fra.com

Comment interroger une table MS-Access à partir de MS-Excel (2010) à l'aide de VBA

J'essaie d'écrire du code vba dans Excel pour interroger une table dans Access. J'ai essayé plusieurs exemples de code pour cela, tels que les liens ajoutés, et ils semblent tous échouer à la partie "Connexion ouverte". J'ai essayé d'utiliser différentes références, mais je ne suis pas sûr de ce que je devrais utiliser, quelles sont les différences entre les différentes versions (Microsoft ActiveX Data Objects 2.0,2.1, ..., 6.0) ou des informations sur le fournisseur. devrait être. Pour les fournisseurs, j’ai l'habitude de voir quelque chose comme: 

"Fournisseur = Microsoft.Jet.OLEDB.4.0; Source de données ="

Mais je ne suis pas sûr si c'est ce que je dois utiliser ou pourquoi/quelles conditions tout élément de la chaîne de fournisseur présentée ci-dessus devrait changer. Quelqu'un peut-il s'il vous plaît me renseigner sur la façon de bien faire ce genre de chose?

Remarque: dans la mesure du possible, j'aimerais une solution qui fonctionnerait sans avoir à télécharger une autre application et qui fonctionnerait pour les versions 2007 et 2010 d'Access et Excel, car elle devra fonctionner sur différents ordinateurs avec éventuellement des versions différentes d'Office.

Liens vers des questions similaires: Echec de la requête Excel VBAhttp://www.mrexcel.com/forum/showthread.php?t=527490

Code: 

Sub asdf()

strFile = "C:\Users\bwall\Desktop\Excel Query Access Testing"

Dim cn As Object
Dim rs As Object
Dim strSql As String
Dim strConnection As String
Dim AppPath As String
Set cn = CreateObject("ADODB.Connection")
AppPath = Application.ActiveWorkbook.Path


strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & AppPath & "\Masterlist_Current_copy.accdb;"
Debug.Print strConnection
strSql = "SELECT [Neptune Number],[Description],[Manufacturer],[Manufacturer P/N] FROM [All Components];"
cn.Open strConnection
Set rs = cn.Execute(strSql)
MsgBox rs.Fields(0) & " rows in MyTable"
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing

End Sub  

valeur de strConnection = 

Fournisseur = Microsoft.Jet.OLEDB.4.0; Data Source = C:\Utilisateurs\bwall\Bureau\Accès aux requêtes Excel Testing\Masterlist_Current_copy.accdb;

12
Bryan

Le code fournisseur doit être Provider=Microsoft.ACE.OLEDB.12.0 si votre base de données cible est au format ACCDB. Provider=Microsoft.Jet.OLEDB.4.0 ne fonctionne que pour l'ancien format MDB.

Vous ne devriez même pas avoir besoin d'installer Access si vous utilisez Windows 32 bits. Jet 4 est inclus dans le système d'exploitation. Si vous utilisez Windows 64 bits, Jet 4 n'est pas inclus, mais vous n'avez toujours pas besoin d'installer Access lui-même. Vous pouvez installer le Microsoft Access Database Engine 2010 Redistributable . Assurez-vous de télécharger la version correspondante (AccessDatabaseEngine.exe pour Windows 32 bits ou AccessDatabaseEngine_x64.exe pour 64 bits).

Vous pouvez éviter le problème de la référence de la version ADO en utilisant une liaison tardive, qui ne nécessite aucune référence.

Dim conn As Object
Set conn = CreateObject("ADODB.Connection")

Attribuez ensuite votre propriété ConnectionString à l'objet conn. Voici un exemple rapide qui s’exécute à partir d’un module de code dans Excel 2003 et affiche une boîte de message avec le nombre de lignes pour MyTable. Il utilise une liaison tardive pour la connexion ADO et les objets de jeu d'enregistrements. Il n'est donc pas nécessaire de définir une référence.

Public Sub foo()
    Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Access\webforums\whiteboard2003.mdb"
    strSql = "SELECT Count(*) FROM MyTable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.fields(0) & " rows in MyTable"
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
End Sub

Si cette réponse ne résout pas le problème, modifiez votre question pour nous montrer la chaîne de connexion complète que vous essayez d'utiliser et le message d'erreur exact que vous recevez en réponse pour cette chaîne de connexion.

20
HansUp
Sub Button1_Click()
Dim cn As Object
    Dim rs As Object
    Dim strSql As String
    Dim strConnection As String
    Set cn = CreateObject("ADODB.Connection")
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\Documents and Settings\XXXXXX\My Documents\my_access_table.accdb"
    strSql = "SELECT Count(*) FROM mytable;"
    cn.Open strConnection
    Set rs = cn.Execute(strSql)
    MsgBox rs.Fields(0) & " rows in MyTable"

    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

End Sub
5
beginer

Tout ce dont vous avez besoin est un ADODB.Connection

Dim cnn As ADODB.Connection ' Requieres reference to the
Dim rs As ADODB.Recordset   ' Microsoft ActiveX Data Objects Library

Set cnn = CreateObject("adodb.Connection")
cnn.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Access\webforums\whiteboard2003.mdb;"

Set rs = cnn.Execute(SQLQuery) ' Retrieve the data
0
agcala