Você não pode alterar, adicionar ou excluir dados em tabelas vinculadas a uma pasta de trabalho do Excel no Access

Número de KB original: 904953

Sintomas

No Microsoft Office Access 2007 ou no Microsoft Office Access 2003 ou no Microsoft Access 2002, você não pode alterar, adicionar ou excluir dados em tabelas vinculadas a uma pasta de trabalho do Microsoft Excel.

Além disso, você pode experimentar esse comportamento quando qualquer uma das seguintes condições for verdadeira:

  • Você cria uma consulta para recuperar dados de tabelas vinculadas a uma pasta de trabalho do Excel.
  • Você cria um formulário que acessa dados de tabelas vinculadas a uma pasta de trabalho do Excel.
  • Você usa DAO ou ADO para atualizar tabelas programaticamente vinculadas a uma pasta de trabalho do Excel.

Você recebe a seguinte mensagem ao executar uma consulta para atualizar registros em uma pasta de trabalho vinculada do Excel:

A operação deve usar uma consulta atualizável

Você recebe a seguinte mensagem ao usar o DAO para atualizar programaticamente tabelas vinculadas a uma pasta de trabalho do Excel:

Erro de runtime '3027' Não é possível atualizar. O banco de dados ou o objeto é somente leitura.

Quando você tenta atualizar os dados vinculados no ADO, a mensagem é a mesma, mas o número de erro pode ser semelhante ao seguinte:

-2147217911 (80040e09)

Ao executar uma consulta para inserir registros em uma pasta de trabalho do Excel, você receberá a seguinte mensagem de erro mesmo que a pasta de trabalho do Excel não esteja vinculada a um banco de dados do Access:

A operação deve usar uma consulta atualizável

Motivo

Esse comportamento esperado ocorre quando uma das seguintes condições é verdadeira:

  • Você está usando o Office Access 2007.
  • Você instalou o Microsoft Office 2003 Service Pack 2 (SP2) ou um service pack posterior ou quaisquer atualizações do Access 2003 que foram lançadas após o Office 2003 SP2.
  • Você instalou a atualização do Access 2002 (KB904018) datada de 18 de outubro de 2005.
  • Você instalou um aplicativo de runtime do Access que inclui o Microsoft Office 2003 Service Pack 2 (SP2) ou um service pack posterior, todas as atualizações do Access 2003 lançadas após o Office 2003 SP2 ou a atualização do Access 2002 (KB904018) datada de 18 de outubro de 2005 ou posterior.

Solução alternativa

Para contornar esse comportamento esperado, use um dos métodos a seguir.

Método 1: usar o Microsoft Excel

Abra a pasta de trabalho vinculada do Excel no Microsoft Excel e faça suas alterações na pasta de trabalho. Quando concluir as alterações, salve as alterações e feche a pasta de trabalho.

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

Importe a pasta de trabalho vinculada do Excel para o Access e faça suas alterações nos dados. Quando concluir as alterações, exporte os dados como um arquivo de .xls do Excel.

Para exportar a tabela do Access para Excel, execute o código a seguir 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

Observação

Neste exemplo de código, substitua os seguintes espaços reservados:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> é espaço reservado para a consulta que você executa em relação às tabelas no banco de dados access. O resultado da consulta é exportado para a pasta de trabalho do Excel.

  • <Planilhas>

    <Planilhas> de trabalho é um espaço reservado para a planilha no Excel para a qual você deseja exportar o resultado. Para executar este exemplo de código, pressione CTRL+G para abrir a janela Imediato , digite Soluções Alternativas e pressione ENTER.

Informações adicionais

Devido a problemas legais, a Microsoft desabilitou a funcionalidade no Access 2003 e no Access 2002 que permitem que os usuários alterem os dados em tabelas vinculadas que apontam para um intervalo em uma pasta de trabalho do Excel. No entanto, quando você faz alterações diretamente na pasta de trabalho do Excel, as alterações aparecem na tabela vinculada no Access.