Não pode alterar, adicionar ou eliminar dados em tabelas ligadas a um livro do Excel no Access
Número original da BDC: 904953
Sintomas
No Microsoft Office Access 2007 ou no Microsoft Office Access 2003 ou no Microsoft Access 2002, não pode alterar, adicionar ou eliminar dados em tabelas ligadas a um livro do Microsoft Excel.
Além disso, poderá deparar-se com este comportamento quando qualquer uma das seguintes condições for verdadeira:
- Pode criar uma consulta para obter dados de tabelas ligadas a um livro do Excel.
- Cria um formulário que acede a dados de tabelas ligadas a um livro do Excel.
- Pode utilizar o DAO ou o ADO para atualizar tabelas através de programação ligadas a um livro do Excel.
Recebe a seguinte mensagem quando efetua uma consulta para atualizar registos num livro do Excel ligado:
A operação tem de utilizar uma consulta atualizável
Recebe a seguinte mensagem quando utiliza o DAO para atualizar programaticamente tabelas ligadas a um livro do Excel:
Erro de runtime "3027" Não é possível atualizar. A base de dados ou objeto é só de leitura.
Quando tenta atualizar os dados ligados no ADO, a mensagem é a mesma, mas o número de erro pode ser semelhante ao seguinte:
-2147217911 (80040e09)
Quando executa uma consulta para inserir registos num livro do Excel, recebe a seguinte mensagem de erro, mesmo que o livro do Excel não esteja ligado a uma base de dados do Access:
A operação tem de utilizar uma consulta atualizável
Causa
Este comportamento esperado ocorre quando uma das seguintes condições é verdadeira:
- Está a utilizar o Office Access 2007.
- Instalou o Microsoft Office 2003 Service Pack 2 (SP2) ou um service pack posterior ou quaisquer atualizações do Access 2003 lançadas após o Office 2003 SP2.
- Instalou a atualização para o Access 2002 (KB904018) datada de 18 de outubro de 2005.
- Instalou uma aplicação de runtime do Access que inclui o Microsoft Office 2003 Service Pack 2 (SP2) ou um service pack posterior, quaisquer atualizações do Access 2003 lançadas após o Office 2003 SP2 ou a atualização para o Access 2002 (KB904018) datado de 18 de outubro de 2005 ou posterior.
Solução
Para contornar este comportamento esperado, utilize um dos seguintes métodos.
Método 1: Utilizar o Microsoft Excel
Abra o livro do Excel ligado no Microsoft Excel e, em seguida, faça as suas alterações ao livro. Quando tiver concluído as alterações, guarde as alterações e, em seguida, feche o livro.
Método 2: Utilizar o Office Access 2007, Access 2003 ou Access 2002
Importe o livro do Excel ligado para o Access e, em seguida, faça as alterações aos dados. Quando tiver concluído as alterações, exporte os dados como um ficheiro de .xls do Excel.
Para exportar a tabela do Access para o Excel, execute o seguinte código no 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
Neste exemplo de código, substitua os seguintes marcadores de posição:
<AccessPath>
<ExcelPath>
<MyQuery>
<MyQuery é o marcador de> posição da consulta que executa nas tabelas na base de dados do Access. O resultado da consulta é exportado para o livro do Excel.
<Folhas de Cálculo>
<Folhas> de Cálculo é um marcador de posição para a folha de cálculo no Excel para a qual pretende exportar o resultado. Para executar este exemplo de código, prima CTRL+G para abrir a janela Imediata , escreva Soluções e, em seguida, prima ENTER.
Mais Informações
Devido a problemas legais, a Microsoft desativou a funcionalidade no Access 2003 e no Access 2002 que permite aos utilizadores alterar os dados em tabelas ligadas que apontam para um intervalo num livro do Excel. No entanto, quando efetua alterações diretamente no livro do Excel, as alterações são apresentadas na tabela ligada no Access.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários