2012-01-31 51 views
10

Estoy escribiendo una aplicación de Excel que se basa en una base de datos de Access para el trabajo. Cuando el usuario abre la herramienta de Excel, una tabla de datos debe rellenar una de las hojas de trabajo de la base de datos de Access que he creado. He estado escribiendo el código VBA en Excel y recibo el error en tiempo de ejecución: "429" Componente ActiveX no puede crear objeto.Escribiendo Excel VBA para recibir datos de Access

Las demás preguntas están todas escritas desde Access, pero creo que necesito este código escrito desde el archivo de libro de Excel. El código que he escrito está en la función Workbook_Open() para que los datos se recopilen a medida que el usuario abre el archivo. Muchas gracias por la ayuda. Por cierto, estoy usando Access 2007 y 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 
+0

En el IDE, herramientas -> referencias; usted necesita "microsoft dao X.XX object library" marcado, ¿es ese el caso? si es así, ¿qué versión? –

+0

Tengo el "Microsoft DAO 3.6 Object Library" marcado. Ahora me está dando error en tiempo de ejecución 3024 Error definido por la aplicación o definido por el objeto – thebiglebowski11

+0

Parece que no se ha encontrado el archivo, ¿está seguro de que la ruta es correcta? –

Respuesta

8

Tyler, ¿podría probar este código para mí? Si obtiene algún error, obtendrá un cuadro de mensaje. Simplemente publique una instantánea del cuadro de mensaje.

'~~> 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 
+1

Sí :) Lo he estado usando durante bastante tiempo. No querría saber qué estaba usando antes :-D CONSEJO: Es un acrónimo de 3 letras para una pregunta que viene automáticamente a nuestra mente cuando ocurre un error :) –

+0

Esto no tiene mucho sentido ... El MsgBox lee: error Descripción: no se pudo encontrar el archivo 'D: \ Tool_Database \ Tool_Database.mdb error en la línea: 0 Número de error: -2147467259 – thebiglebowski11

+0

Eso es sin duda la ubicación de mi base de datos ... – thebiglebowski11

0

Funciona bien en mi máquina (excepto los nombres de campo se sobreescriben por la primera fila de datos - de los nombres de campo es probable que decir TargetRange.Offset (0 , intColIndex)).

¿Tiene Herramientas -> Referencias ... a la biblioteca Objeto Microsoft DAO 3.6?

¿Quizás esté utilizando la versión de 64 bits de Excel 2010 (ver debajo de Archivo-> Ayuda en la sección 'Acerca de Microsoft Excel')? De ser así, las bibliotecas DAO de la versión anterior no funcionarán, y deberá instalar la biblioteca DAO ACE de 64 bits, que está disponible para 64 bits.

+0

De hecho, estoy ejecutando el archivo a través de un servidor remoto. Aunque buscaré la biblioteca 3.6. El código en última instancia, debe copiar la base de datos y ponerla en la hoja de trabajo, ¿verdad? – thebiglebowski11

+1

Funciona en mi máquina. Hice un nuevo .mdb con una tabla, pegué su código en un nuevo libro de trabajo, agregué las Herramientas-> Referencia a DAO 3.6, cambié la ruta DBFullName y funcionó. – Govert

3

Tanto DAO como ADO incluyen tipos de objetos de conjunto de registros. Sin embargo, no son compatibles. Su declaración para la variable de objeto rs es ambigua.

Dim db As DAO.Database, rs As Recordset 

Un problema potencial es que si su proyecto incluye una referencia a ADO y la precedencia de esa referencia está por encima de su referencia DAO, rs va a acabar como un conjunto de registros ADO en lugar de un conjunto de registros DAO.

No estoy seguro de que esta sea la causa del error que está viendo. Sin embargo, establecer rs en db.OpenRecordset(something) debería fallar si rs es un conjunto de registros ADO porque OpenRecordset devuelve un conjunto de registros DAO.

Creo que deberías cambiar la declaración a este:

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

Incluso si ese cambio no resuelve su problema, le animo a siempre calificar el tipo al declarar variables de objeto de registros ... para evitar la ambigüedad

Y si esta no es la solución, díganos qué línea de su código desencadena el error actual que está viendo.

Esta es otra señal de alerta:

Dim TargetRande As String 

Más tarde tiene:

Set TargetRange = Range("A1") 

Añadir Option Explict a la sección Declaraciones del módulo. A continuación, elija Depurar-> Compilar en el menú principal del editor VB. Ese esfuerzo destacará los nombres de las variables mal escritas y también le alertará sobre los errores de sintaxis.