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.