Non è possibile modificare, aggiungere o eliminare dati in tabelle collegate a una cartella di lavoro di Excel in Access

Numero KB originale: 904953

Sintomi

In Microsoft Office Access 2007 o in Microsoft Office Access 2003 o in Microsoft Access 2002 non è possibile modificare, aggiungere o eliminare dati in tabelle collegate a una cartella di lavoro di Microsoft Excel.

Inoltre, questo comportamento può verificarsi quando si verifica una qualsiasi delle condizioni seguenti:

  • Si compila una query per recuperare dati da tabelle collegate a una cartella di lavoro di Excel.
  • Si compila un modulo che accede ai dati delle tabelle collegate a una cartella di lavoro di Excel.
  • Si usa DAO o ADO per aggiornare le tabelle a livello di codice collegate a una cartella di lavoro di Excel.

Quando si esegue una query per aggiornare i record in una cartella di lavoro di Excel collegata, viene visualizzato il messaggio seguente:

L'operazione deve usare una query aggiornabile

Quando si usa DAO per aggiornare a livello di codice le tabelle collegate a una cartella di lavoro di Excel, viene visualizzato il messaggio seguente:

Errore di runtime '3027' Impossibile aggiornare. Database o oggetto di sola lettura.

Quando si tenta di aggiornare i dati collegati in ADO, il messaggio è lo stesso, ma il numero di errore potrebbe essere simile al seguente:

-2147217911 (80040e09)

Quando si esegue una query per inserire record in una cartella di lavoro di Excel, viene visualizzato il messaggio di errore seguente anche se la cartella di lavoro di Excel non è collegata a un database di Access:

L'operazione deve usare una query aggiornabile

Causa

Questo comportamento previsto si verifica quando si verifica una delle condizioni seguenti:

  • Si usa Office Access 2007.
  • È stato installato Microsoft Office 2003 Service Pack 2 (SP2) o un Service Pack successivo o qualsiasi aggiornamento di Access 2003 rilasciato dopo Office 2003 SP2.
  • È stato installato l'aggiornamento per Access 2002 (KB904018) datato 18 ottobre 2005.
  • È stata installata un'applicazione di runtime di Access che include Microsoft Office 2003 Service Pack 2 (SP2) o un Service Pack successivo, qualsiasi aggiornamento di Access 2003 rilasciato dopo Office 2003 SP2 o l'aggiornamento per Access 2002 (KB904018) datato 18 ottobre 2005 o versioni successive.

Soluzione alternativa

Per risolvere questo comportamento previsto, usare uno dei metodi seguenti.

Metodo 1: Usare Microsoft Excel

Aprire la cartella di lavoro di Excel collegata in Microsoft Excel e quindi apportare le modifiche apportate alla cartella di lavoro. Dopo aver completato le modifiche, salvare le modifiche e quindi chiudere la cartella di lavoro.

Metodo 2: Usare Office Access 2007, Access 2003 o Access 2002

Importare la cartella di lavoro di Excel collegata in Access e quindi apportare le modifiche ai dati. Dopo aver completato le modifiche, esportare i dati come file di .xls di Excel.

Per esportare la tabella da Access a Excel, eseguire il codice seguente in 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

Nota

In questo esempio di codice sostituire i segnaposto seguenti:

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery> è segnaposto per la query eseguita sulle tabelle nel database di Access. Il risultato della query viene esportato nella cartella di lavoro di Excel.

  • <Fogli>

    <WorkSheets> è un segnaposto per il foglio di lavoro in Excel in cui si desidera esportare il risultato. Per eseguire questo esempio di codice, premere CTRL+G per aprire la finestra Immediata , digitare Soluzioni alternative e quindi premere INVIO.

Ulteriori informazioni

A causa di problemi legali, Microsoft ha disabilitato la funzionalità in Access 2003 e in Access 2002 che consente agli utenti di modificare i dati nelle tabelle collegate che puntano a un intervallo in una cartella di lavoro di Excel. Tuttavia, quando si apportano modifiche direttamente nella cartella di lavoro di Excel, le modifiche vengono visualizzate nella tabella collegata in Access.