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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de