Du kan inte ändra, lägga till eller ta bort data i tabeller som är länkade till en Excel-arbetsbok i Access

Ursprungligt KB-nummer: 904953

Symptom

I Microsoft Office Access 2007 eller 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.

Dessutom kan du uppleva det här beteendet 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 kommer å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 länkade till en Excel-arbetsbok.

Du får följande meddelande när du utfö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 programmatiskt uppdatera tabeller som är länkade till en Excel-arbetsbok:

Körningsfelet 3027 kan inte uppdateras. Databasen eller objektet är skrivskyddat.

När du försöker uppdatera länkade data i ADO är meddelandet detsamma, men felnumret kan likna följande:

-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

Det här förväntade beteendet 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 ett senare service pack eller access 2003-uppdateringar som släpptes efter Office 2003 SP2.
  • Du har installerat uppdateringen för Access 2002 (KB904018) som är daterad den 18 oktober 2005.
  • Du har installerat ett Access Runtime-program som innehåller Microsoft Office 2003 Service Pack 2 (SP2) eller ett senare service pack, alla Access 2003-uppdateringar som släpptes efter Office 2003 SP2 eller uppdateringen för Access 2002 (KB904018) som är daterad den 18 oktober 2005 eller senare.

Lösning

Använd någon av följande metoder för att kringgå det här förväntade beteendet.

Metod 1: Använd Microsoft Excel

Öppna den länkade Excel-arbetsboken i Microsoft Excel och gör sedan dina ändringar i arbetsboken. När du har slutfört ändringarna sparar du ändringarna och stänger sedan arbetsboken.

Metod 2: Använd Office Access 2007, Access 2003 eller Access 2002

Importera den länkade Excel-arbetsboken till Access och gör sedan dina ändringar i data. När du har slutfört ändringarna exporterar du data som en Excel-.xls fil.

Om du vill exportera tabellen från Access till Excel 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

Obs!

I det här kodexemplet ersätter du följande platshållare:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> är platshållare för frågan som du kör mot tabellerna i Access-databasen. Resultatet av frågan exporteras till Excel-arbetsboken.

  • <Kalkylblad>

    <WorkSheets> är en platshållare för kalkylbladet i Excel som du vill exportera resultatet till. Om du vill köra det här kodexemplet trycker du på CTRL+G för att öppna fönstret Omedelbart , skriver WorkArounds och trycker sedan på RETUR.

Mer information

På grund av juridiska problem har Microsoft inaktiverat funktionerna i Access 2003 och i Access 2002 som låter användare ändra data i länkade tabeller som pekar på ett intervall i en Excel-arbetsbok. Men när du gör ändringar direkt i Excel-arbetsboken visas ändringarna i den länkade tabellen i Access.