web-dev-qa-db-fra.com

Écriture d'Excel VBA pour recevoir des données d'accès

J'écris une application Excel qui s'appuie sur une base de données Access pour le travail. Lorsque l'utilisateur ouvre l'outil Excel, une table de données doit renseigner l'une des feuilles de calcul à partir de la base de données Access que j'ai créée. J'ai écrit le code VBA dans Excel et je reçois une erreur d'exécution: le composant "429" ActiveX ne peut pas créer d'objet. 

Les autres questions sont toutes écrites à partir d'Access mais je crois que j'ai besoin de ce code écrit à partir du fichier de classeur Excel. Le code que j'ai écrit est dans la fonction Workbook_Open() afin que les données soient collectées dès que l'utilisateur ouvre le fichier. Merci beaucoup pour l'aide. BTW, j'utilise Access 2007 et Excel 2010.

Private Sub Workbook_Open()
    'Will fill the first listbox with data from the Access database
    Dim DBFullName As String
    Dim TableName As String
    Dim FieldName As String
    Dim TargetRande As String

    DBFullName = "D:\Tool_Database\Tool_Database.mdb"

    Dim db As DAO.Database, rs As Recordset
    Dim intColIndex As Integer

    Set TargetRange = Range("A1")
    Set db = OpenDatabase(DBFullName)
    Set rs = db.OpenRecordset("SELECT * FROM ToolNames WHERE Item = 'Tool'", dbReadOnly)

    ' Write the field names
    For intColIndex = 0 To rs.Fields.Count - 1
        TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
    Next

    ' Write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs

    Set rs = Nothing
    db.Close
    Set db = Nothing
End Sub
10
thebiglebowski11

Tyler, Pourriez-vous s'il vous plaît tester ce code pour moi? Si vous obtenez une erreur, vous obtiendrez une boîte de message. Il suffit de poster un instantané de la boîte de message.

'~~> Remove all references as the below code uses Late Binding with ADO.

Private Sub Workbook_Open()
          Dim cn As Object, rs As Object
          Dim intColIndex As Integer
          Dim DBFullName As String
          Dim TargetRange As Range

10        DBFullName = "D:\Tool_Database\Tool_Database.mdb"

20        On Error GoTo Whoa

30        Application.ScreenUpdating = False

40        Set TargetRange = Sheets("Sheet1").Range("A1")

50        Set cn = CreateObject("ADODB.Connection")
60        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"

70        Set rs = CreateObject("ADODB.Recordset")
80        rs.Open "SELECT * FROM ToolNames WHERE Item = 'Tool'", cn, , , adCmdText

          ' Write the field names
90        For intColIndex = 0 To rs.Fields.Count - 1
100           TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
110       Next

          ' Write recordset
120       TargetRange.Offset(1, 0).CopyFromRecordset rs

LetsContinue:
130       Application.ScreenUpdating = True
140       On Error Resume Next
150       rs.Close
160       Set rs = Nothing
170       cn.Close
180       Set cn = Nothing
190       On Error GoTo 0
200       Exit Sub
Whoa:
210       MsgBox "Error Description :" & Err.Description & vbCrLf & _
             "Error at line     :" & Erl & vbCrLf & _
             "Error Number      :" & Err.Number
220       Resume LetsContinue
End Sub
8
Siddharth Rout

DAO et ADO incluent des types d'objet de jeu d'enregistrements. Cependant, ils ne sont pas compatibles. Votre déclaration pour la variable d'objet rs est ambiguë.

Dim db As DAO.Database, rs As Recordset

Un problème potentiel est que si votre projet inclut une référence à ADO et que la priorité de cette référence est supérieure à votre référence DAO, rs se terminera sous la forme d'un jeu d'enregistrements ADO plutôt que d'un jeu d'enregistrements DAO. 

Je ne suis pas sûr que ce soit la cause de l'erreur que vous constatez. Toutefois, définir rs sur db.OpenRecordset(something) devrait échouer si rs est un jeu d'enregistrements ADO, car OpenRecordset renvoie un jeu d'enregistrements DAO.

Je pense que vous devriez changer la déclaration en ceci:

Dim db As DAO.Database, rs As DAO.Recordset

Même si ce changement ne résout pas votre problème, je vous encourage à toujours qualifier le type lors de la déclaration de variables d'objet de jeu d'enregistrements ... afin d'éviter toute ambiguïté.

Si ce n'est pas le cas, dites-nous quelle ligne de votre code déclenche l'erreur en cours.

Voici un autre drapeau rouge:

Dim TargetRande As String

Plus tard, vous avez:

Set TargetRange = Range("A1")

Ajoutez Option Explict à la section Déclarations de votre module. Ensuite, choisissez Debug-> Compile dans le menu principal de l'éditeur VB. Cet effort mettra en évidence les noms de variables mal orthographiés et vous alertera des erreurs de syntaxe.

3
HansUp

Cela fonctionne bien sur ma machine (sauf que les noms de champs sont écrasés par la première ligne de données - pour les noms de champs, vous voulez probablement dire TargetRange.Offset (0, intColIndex)).

Avez-vous un Outils -> Références ... à la bibliothèque d'objets Microsoft DAO 3.6?

Utilisez-vous peut-être la version 64 bits d'Excel 2010 (consultez la section «Fichier -> Aide dans la section« À propos de Microsoft Excel »)? Si tel est le cas, les anciennes versions des bibliothèques DAO ne fonctionneront pas et vous devrez installer la bibliothèque ACE DAO 64 bits, disponible en version 64 bits.

0
Govert