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
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
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.
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.