Esta es mi primera pregunta, ¡así que la crítica constructiva es bienvenida! Estoy intentando consultar una base de datos de acceso de Excel vba y colocar la información de devolución en un rango de Excel. Me sale este error:

Mensaje de error: "Error en tiempo de ejecución '3709' La conexión no se puede utilizar para realizar esta operación. En este contexto, está cerrada o no es válida".

Código:

Sub Importfromaccess()
        Path = "C:\Users\myUser\Desktop\Database1.accdb"

        Set cn = CreateObject("ADODB.connection")

        cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & ";"

        Set rs1 = CreateObject("ADODB.recordset")

        rs1.activeconnection = cn

        Dim strSQL As New ADODB.Command

        strSQL.CommandText = "SELECT * FROM Tooling WHERE TID=BD0001"
        strSQL.CommandType = adCmdText

        Set rs1 = strSQL.Execute ' This is the line the error occurs on

        Sheets("Calc").Range("K1").CopyFromRecordset rs1
End Sub

He habilitado las siguientes referencias:

  1. Visual Basic para Aplicaciones,
  2. Biblioteca de objetos de Microsoft Excel 16.0,
  3. Automatización OLE,
  4. Biblioteca de objetos de Microsoft Office 16.0,
  5. Biblioteca de objetos de Microsoft Access 16.0,
  6. Biblioteca Microsoft ActiveX Data Objects 2.0,

Traté de colocar la línea:

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & ";"

Justo antes de la línea de error y recibió este error:

Error en tiempo de ejecución '3705': la operación no está permitida cuando el objeto está abierto.

¿Alguien sabe cuál podría ser mi problema?

2
user7322614 23 dic. 2016 a las 19:06

3 respuestas

La mejor respuesta

Primero (y sin relación con su error), a menos que necesite admitir clientes que usan Windows 2000 o anterior, debe hacer referencia a la versión más alta de Microsoft ActiveX Data Objects en lugar de 2.0. Si solo usa ADODB para interactuar con la base de datos, no necesita la Biblioteca de objetos de Microsoft Access 16.0.

En segundo lugar, si ya tiene una referencia , no cree objetos enlazados tarde como este:

Set cn = CreateObject("ADODB.connection")

Agregar la referencia al principio vincula el tipo, así que explíquelos explícitamente y ejemplifíquelos usando New:

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection

Su cadena de conexión debe estar bien, donde se encuentra con problemas son estas 2 líneas:

    Set rs1 = CreateObject("ADODB.recordset")

    rs1.activeconnection = cn

Ejecutar un ADODB.Command devolverá el Recordset, no al revés. Elimina esas 2 líneas por completo. En lugar de conectar la conexión al Recordset, debe usarlo cuando esté creando su ADODB.Command:

    Dim strSQL As New ADODB.Command
    strSQL.ActiveConnection = cn      '<---Insert this.
    strSQL.CommandText = "SELECT * FROM Table1"
    strSQL.CommandType = adCmdText

Además, deshazte de la notación húngara allí, es confusa como el infierno. Un comando ADODB no es un String, entonces, ¿por qué debería llamarse strFoo?

También necesita limpiar después de usted mismo: no deje su conjunto de registros y conexión simplemente colgando cuando haya terminado con ellos. Llame a .Close cuando haya terminado.

Finalmente, su declaración SQL es probablemente incorrecta: es probable que necesite encerrar su TID entre comillas simples ('):

"SELECT * FROM Tooling WHERE TID='BD0001'"

Debería mirar más de cerca a esto:

Sub Importfromaccess()
    Dim Path As String
    Path = "C:\Users\myUser\Desktop\Database1.accdb"

    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & ";"

    Dim query As New ADODB.Command
    query.ActiveConnection = cn
    query.CommandText = "SELECT * FROM Tooling WHERE TID='BD0001'"
    query.CommandType = adCmdText

    Dim rs1 As ADODB.Recordset
    Set rs1 = query.Execute ' This is the line the error occurs on

    Sheets("Calc").Range("K1").CopyFromRecordset rs1

    'CLEAN UP AFTER YOURSELF:
    rs1.Close
    cn.Close 
End Sub
5
Graham 21 sep. 2017 a las 21:37

Después de un reordenamiento completo, creo que lo descubrí. Estoy sorprendido de los cambios que solucionaron el problema, pero el siguiente código funciona:

Dim con As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As New ADODB.Command

cmd.CommandText = "SELECT * FROM Tooling WHERE TID='BD0001'"
con.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Users\myUser\Desktop\Database1.accdb;"

cmd.ActiveConnection = con

Set rs = cmd.Execute

Sheets("Calc").Range("K1").CopyFromRecordset rs

rs.Close
con.Close

El error final se solucionó con:

cmd.CommandText = "SELECT * FROM Tooling WHERE TID='BD0001'"

Esta línea anteriormente no incluía comillas simples alrededor de BD0001.

También agregué una ActiveConnection al objeto Command.

Editar: ¡Esta es la versión de trabajo más simple que podría administrar por cortesía de todos ustedes, personas útiles!

0
23 dic. 2016 a las 17:30

Usted ya Set rs1

¿Qué tal probar algo más como:

Sub Importfromaccess()
  Dim strSQL As String, strPath as String
  Dim cn as Object, rs1 as Object

  strPath = "C:\Users\myUser\Desktop\Database1.accdb"
  Set cn = CreateObject("ADODB.connection")

  cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Path & ";"

  Set rs1 = CreateObject("ADODB.Recordset")

  strSQL = "SELECT * FROM Tooling WHERE TID='BD0001'"
  rs1.Open strSQL, cn

  Sheets("Calc").Range("K1").CopyFromRecordset rs1
End Sub
1
Rdster 23 dic. 2016 a las 16:54