Нельзя изменять, добавлять или удалять данные в таблицах, связанных с книгой Excel в Access

Исходный номер базы знаний: 904953

Симптомы

В Microsoft Office Access 2007, Microsoft Office Access 2003 или Microsoft Access 2002 нельзя изменять, добавлять или удалять данные в таблицах, связанных с книгой Microsoft Excel.

Кроме того, вы можете столкнуться с этим поведением, если выполняется одно из следующих условий:

  • Вы создаете запрос для получения данных из таблиц, связанных с книгой Excel.
  • Вы создаете форму, которая обращается к данным из таблиц, связанных с книгой Excel.
  • Вы используете DAO или ADO для программного обновления таблиц, связанных с книгой Excel.

При выполнении запроса на обновление записей в связанной книге Excel появляется следующее сообщение:

Операция должна использовать обновляемый запрос

При использовании DAO для программного обновления таблиц, связанных с книгой Excel, появляется следующее сообщение:

Ошибка среды выполнения "3027" не удается обновить. База данных или объект доступны только для чтения.

При попытке обновить связанные данные в ADO сообщение будет таким же, но номер ошибки может выглядеть примерно так:

-2147217911 (80040e09)

При выполнении запроса на вставку записей в книгу Excel появляется следующее сообщение об ошибке, даже если книга Excel не связана с базой данных Access:

Операция должна использовать обновляемый запрос

Причина

Это ожидаемое поведение возникает при выполнении любого из следующих условий:

  • Вы используете Office Access 2007.
  • Вы установили Microsoft Office 2003 с пакетом обновления 2 (SP2) или более поздней версии или любые обновления Access 2003, выпущенные после Office 2003 с пакетом обновления 2 (SP2).
  • Вы установили обновление для Access 2002 (KB904018), датированное 18 октября 2005 г.
  • Вы установили приложение среды выполнения Access, включающее Microsoft Office 2003 с пакетом обновления 2 (SP2) или более поздней версии, все обновления Access 2003, выпущенные после Office 2003 с пакетом обновления 2 (SP2), или обновление для Access 2002 (KB904018), датированное 18 октября 2005 г. или более поздней версии.

Обходной путь

Чтобы обойти это ожидаемое поведение, используйте один из следующих методов.

Способ 1. Использование Microsoft Excel

Откройте связанную книгу Excel в Microsoft Excel и внесите в нее изменения. После завершения изменений сохраните изменения, а затем закройте книгу.

Способ 2. Использование Office Access 2007, Access 2003 или Access 2002

Импортируйте связанную книгу Excel в Access, а затем внесите изменения в данные. После внесения изменений экспортируйте данные в виде файла .xls Excel.

Чтобы экспортировать таблицу из Access в Excel, выполните следующий код в 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

Примечание.

В этом примере кода замените следующие заполнители:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> — это заполнитель для запроса, выполняемого к таблицам в базе данных Access. Результат запроса экспортируется в книгу Excel.

  • <Листов>

    <WorkSheets> — это заполнитель для листа в Excel, в который требуется экспортировать результат. Чтобы запустить этот пример кода, нажмите клавиши CTRL+G, чтобы открыть окно Интерпретация , введите WorkArounds и нажмите клавишу ВВОД.

Дополнительные сведения

Из-за юридических проблем корпорация Майкрософт отключила функции в Access 2003 и Access 2002, которые позволяют пользователям изменять данные в связанных таблицах, указывающих на диапазон в книге Excel. Однако при внесении изменений непосредственно в книгу Excel изменения отображаются в связанной таблице в Access.