V tabulkách propojených s excelovými sešity v Accessu nejde měnit, přidávat ani odstraňovat data.

Původní číslo KB: 904953

Příznaky

V aplikaci Microsoft Office Access 2007, Microsoft Office Access 2003 nebo Microsoft Access 2002 nelze změnit, přidat nebo odstranit data v tabulkách, které jsou propojeny se sešitem aplikace Microsoft Excel.

K tomuto chování může dojít také v případě, že platí některá z následujících podmínek:

  • Vytvoříte dotaz pro načtení dat z tabulek, které jsou propojené s excelovým sešitem.
  • Vytvoříte formulář, který přistupuje k datům z tabulek propojených s excelovým sešitem.
  • Rozhraní DAO nebo ADO slouží k aktualizaci tabulek, které jsou propojeny s excelovým sešitem prostřednictvím kódu programu.

Při provádění dotazu na aktualizaci záznamů v propojeném sešitu aplikace Excel se zobrazí následující zpráva:

Operace musí používat aktualizovatelný dotaz.

Při použití rozhraní DAO k programové aktualizaci tabulek, které jsou propojeny se sešitem aplikace Excel, se zobrazí následující zpráva:

Chyba modulu runtime 3027 nelze aktualizovat. Databáze nebo objekt jsou jen pro čtení.

Při pokusu o aktualizaci propojených dat v ADO je zpráva stejná, ale číslo chyby může být podobné následujícímu:

-2147217911 (80040e09)

Když spustíte dotaz pro vložení záznamů do excelového sešitu, zobrazí se následující chybová zpráva, i když sešit aplikace Excel není propojený s databází aplikace Access:

Operace musí používat aktualizovatelný dotaz.

Příčina

K tomuto očekávanému chování dochází při splnění některé z následujících podmínek:

  • Používáte Office Access 2007.
  • Nainstalovali jste aktualizaci Microsoft Office 2003 Service Pack 2 (SP2) nebo novější nebo všechny aktualizace aplikace Access 2003 vydané po aktualizaci Office 2003 SP2.
  • Nainstalovali jste aktualizaci pro Access 2002 (KB904018), která je datována 18. října 2005.
  • Nainstalovali jste aplikaci accessového modulu runtime, která obsahuje aktualizaci Microsoft Office 2003 Service Pack 2 (SP2) nebo novější, všechny aktualizace Accessu 2003 vydané po aktualizaci Office 2003 SP2 nebo aktualizaci pro Access 2002 (KB904018), která je datována 18. října 2005 nebo novější.

Řešení

Chcete-li toto očekávané chování obejít, použijte jednu z následujících metod.

Metoda 1: Použití aplikace Microsoft Excel

Otevřete propojený excelový sešit v Microsoft Excelu a proveďte změny v sešitu. Po dokončení změn změny uložte a pak sešit zavřete.

Metoda 2: Použití Office Accessu 2007, Accessu 2003 nebo Accessu 2002

Importujte propojený excelový sešit do Accessu a proveďte změny dat. Po dokončení změn exportujte data jako excelový .xls soubor.

Pokud chcete exportovat tabulku z Accessu do Excelu, spusťte v Accessu následující kód.

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

Poznámka

V tomto příkladu kódu nahraďte následující zástupné symboly:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> je zástupný symbol pro dotaz, který spustíte pro tabulky v accessové databázi. Výsledek dotazu se exportuje do excelového sešitu.

  • <Listy>

    <Pracovní listy> jsou zástupné symboly pro list v aplikaci Excel, do kterého chcete exportovat výsledek. Pokud chcete spustit tento příklad kódu, stisknutím kombinace kláves CTRL+G otevřete okno Immediate , zadejte WorkArounds a stiskněte klávesu ENTER.

Další informace

Kvůli právním problémům microsoft zakázal v Accessu 2003 a Accessu 2002 funkci, která uživatelům umožňuje měnit data v propojených tabulkách, které ukazují na oblast v excelovém sešitu. Když ale provedete změny přímo v excelovém sešitu, zobrazí se změny v propojené tabulce v Accessu.