No se pueden cambiar, agregar ni eliminar datos en tablas vinculadas a un libro de Excel en Access

Número de KB original: 904953

Síntomas

En Microsoft Office Access 2007 o en Microsoft Office Access 2003 o en Microsoft Access 2002, no puede cambiar, agregar ni eliminar datos en tablas vinculadas a un libro de Microsoft Excel.

Además, puede experimentar este comportamiento cuando se cumple alguna de las condiciones siguientes:

  • Cree una consulta para recuperar datos de tablas vinculadas a un libro de Excel.
  • Se crea un formulario que accede a datos de tablas vinculadas a un libro de Excel.
  • Use DAO o ADO para actualizar tablas mediante programación vinculadas a un libro de Excel.

Recibirá el siguiente mensaje cuando realice una consulta para actualizar los registros de un libro de Excel vinculado:

La operación debe usar una consulta actualizable.

Recibirá el siguiente mensaje cuando use DAO para actualizar mediante programación las tablas vinculadas a un libro de Excel:

Error en tiempo de ejecución '3027' No se puede actualizar. Base de datos u objeto de sólo lectura.

Al intentar actualizar los datos vinculados en ADO, el mensaje es el mismo, pero el número de error puede ser similar al siguiente:

-2147217911 (80040e09)

Al ejecutar una consulta para insertar registros en un libro de Excel, recibe el siguiente mensaje de error incluso si el libro de Excel no está vinculado a una base de datos de Access:

La operación debe usar una consulta actualizable.

Causa

Este comportamiento esperado se produce cuando se cumple alguna de las condiciones siguientes:

  • Está usando Office Access 2007.
  • Ha instalado Microsoft Office 2003 Service Pack 2 (SP2) o un Service Pack posterior o cualquier actualización de Access 2003 publicada después de Office 2003 SP2.
  • Ha instalado la actualización de Access 2002 (KB904018) con fecha del 18 de octubre de 2005.
  • Ha instalado una aplicación en tiempo de ejecución de Access que incluye Microsoft Office 2003 Service Pack 2 (SP2) o un Service Pack posterior, cualquier actualización de Access 2003 publicada después de Office 2003 SP2 o la actualización de Access 2002 (KB904018) con fecha del 18 de octubre de 2005 o posterior.

Solución alternativa

Para evitar este comportamiento esperado, use uno de los métodos siguientes.

Método 1: Uso de Microsoft Excel

Abra el libro de Excel vinculado en Microsoft Excel y, a continuación, realice los cambios en el libro. Cuando haya completado los cambios, guarde los cambios y cierre el libro.

Método 2: Usar Office Access 2007, Access 2003 o Access 2002

Importe el libro de Excel vinculado a Access y, a continuación, realice los cambios en los datos. Cuando haya completado los cambios, exporte los datos como un archivo .xls de Excel.

Para exportar la tabla de Access a Excel, ejecute el código siguiente en Access.

Public Sub WorkArounds()
On Error GoTo Leave

Dim strSQL, SQL As String
    Dim Db As ADODB.Connection
    Set Db = New ADODB.Connection
    Db.CursorLocation = adUseClient
    Db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=<AccessPath>"
    'Note: In Office Access 2007, use the following line of code:
    'Db.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=<AccessPath>"
    SQL = "<MyQuery>"
    CopyRecordSetToXL SQL, Db
    Db.Close
    MsgBox "Access has successfully exported the data to excel file.", vbInformation, "Export Successful."
    Exit Sub
Leave:
        MsgBox Err.Description, vbCritical, "Error"
        Exit Sub
End Sub

Private Sub CopyRecordSetToXL(SQL As String, con As ADODB.Connection)
    Dim rs As New ADODB.Recordset
    Dim x
    Dim i As Integer, y As Integer
    Dim xlApp As Excel.Application
    Dim xlwbBook As Excel.Workbook, xlwbAddin As Excel.Workbook
    Dim xlwsSheet As Excel.Worksheet
    Dim rnData As Excel.Range
    Dim stFile As String, stAddin As String
    Dim rng As Range
    stFile = "<ExcelPath>"
    'Instantiate a new session with the COM-Object Excel.exe.
    Set xlApp = New Excel.Application
    Set xlwbBook = xlApp.Workbooks.Open(stFile)
    Set xlwsSheet = xlwbBook.Worksheets("<WorkSheets>")
    xlwsSheet.Activate
    'Getting the first cell to input the data.
    xlwsSheet.Cells.SpecialCells(xlCellTypeLastCell).Select
    y = xlApp.ActiveCell.Column - 1
    xlApp.ActiveCell.Offset(1, -y).Select
    x = xlwsSheet.Application.ActiveCell.Cells.Address
    'Opening the recordset based on the SQL query and saving the data in the Excel worksheet.
    rs.CursorLocation = adUseClient
    If rs.State = adStateOpen Then
        rs.Close
    End If
    rs.Open SQL, con
    If rs.RecordCount > 0 Then
        rs.MoveFirst
        x = Replace(x, "$", "")
        y = Mid(x, 2)
        Set rng = xlwsSheet.Range(x)
        xlwsSheet.Range(x).CopyFromRecordset rs
    End If
    xlwbBook.Close True
    xlApp.Quit
    Set xlwsSheet = Nothing
    Set xlwbBook = Nothing
    Set xlApp = Nothing

End Sub

Nota:

En este ejemplo de código, reemplace los siguientes marcadores de posición:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> es el marcador de posición de la consulta que se ejecuta en las tablas de la base de datos de Access. El resultado de la consulta se exporta al libro de Excel.

  • <Hojas de trabajo>

    <WorkSheets> es un marcador de posición para la hoja de cálculo de Excel a la que desea exportar el resultado. Para ejecutar este ejemplo de código, presione CTRL+G para abrir la ventana Inmediato , escriba WorkArounds y presione ENTRAR.

Más información

Debido a problemas legales, Microsoft ha deshabilitado la funcionalidad en Access 2003 y en Access 2002 que permite a los usuarios cambiar los datos de las tablas vinculadas que apuntan a un rango en un libro de Excel. Sin embargo, al realizar cambios directamente en el libro de Excel, los cambios aparecen en la tabla vinculada de Access.