Du kan inte ändra, lägga till eller ta bort data i tabeller som är länkade till en Excel-arbetsbok i Access
Anteckning
Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.
Ursprungligt KB-nummer: 904953
Symptom
I Microsoft Office Access 2007 eller i Microsoft Office Access 2003 eller Microsoft Access 2002 kan du inte ändra, lägga till eller ta bort data i tabeller som är länkade till en Microsoft Excel arbetsbok.
Du kan dessutom uppleva detta när något av följande villkor är sant:
- Du skapar en fråga för att hämta data från tabeller som är länkade till en Excel arbetsbok.
- Du skapar ett formulär som kan komma åt data från tabeller som är länkade till en Excel arbetsbok.
- Du använder DAO eller ADO för att uppdatera tabeller programmässigt som är kopplade till en Excel arbetsbok.
Du får följande meddelande när du gör en fråga för att uppdatera poster i en länkad Excel arbetsbok:
Åtgärden måste använda en uppdateringsbar fråga
Du får följande meddelande när du använder DAO för att programmässigt uppdatera tabeller som är länkade till en Excel arbetsbok:
Körningsfel '3027' Kan inte uppdatera. Databasen eller objektet är skrivskyddat.
När du försöker uppdatera länkade data i ADO är meddelandet detsamma, men felnumret kan se ut ungefär så här:
-2147217911 (80040e09)
När du kör en fråga för att infoga poster i en Excel-arbetsbok får du följande felmeddelande även om Excel-arbetsboken inte är länkad till en Access-databas:
Åtgärden måste använda en uppdateringsbar fråga
Orsak
Detta förväntade beteende inträffar när något av följande villkor är sant:
- Du använder Office Access 2007.
- Du har installerat Microsoft Office 2003 Service Pack 2 (SP2) eller senare service pack eller alla Access 2003-uppdateringar som släppts efter Office 2003 SP2.
- Du har installerat uppdateringen för Access 2002 (KB904018) från den 18 oktober 2005.
- Du har installerat ett Access Runtime-program som innehåller Microsoft Office 2003 Service Pack 2 (SP2) eller senare service pack, alla Access 2003-uppdateringar som släppts efter Office 2003 SP2 eller uppdateringen för Access 2002 (KB904018) som är daterade den 18 oktober 2005 eller senare.
Lösning
Använd någon av följande metoder för att komma runt det här förväntade beteendet.
Metod 1: Använd Microsoft Excel
Öppna den Excel i Microsoft Excel och gör sedan ändringarna i arbetsboken. När du är klar med ändringarna sparar du ändringarna och stänger arbetsboken.
Metod 2: Office Access 2007, Access 2003 eller Access 2002
Importera den Excel arbetsboken till Access och gör sedan ändringarna. När du är klar med ändringarna exporterar du data som Excel .xls filen.
Om du vill exportera tabellen från Access Excel tabellen kör du följande kod i 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
Anteckning
Ersätt följande platshållare i det här kodexempel:
<AccessPath>
<ExcelPath>
<MyQuery>
<MyQuery> är platshållare för frågan som körs mot tabellerna i Access-databasen. Resultatet av frågan exporteras till arbetsboken Excel frågan.
<WorkSheets>
<WorkSheets>är en platshållare för kalkylbladet i Excel som du vill exportera resultatet till. Om du vill köra det här kodexempel trycker du på CTRL+G för att öppna direktfönstret, skriver WorkArounds och trycker sedan på RETUR.
Mer information
På grund av juridiska problem har Microsoft inaktiverat funktionerna i Access 2003 och Access 2002 där användare kan ändra data i länkade tabeller som pekar på ett område i en Excel arbetsbok. Men när du gör ändringar direkt i Excel arbetsboken visas ändringarna i den länkade tabellen i Access.