Нельзя изменять, добавлять или удалять данные в таблицах, связанных с книгой 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по