Vous ne pouvez pas modifier, ajouter ou supprimer des données dans des tableaux liés à un classeur Excel dans Access

Numéro de la base de connaissances d’origine : 904953

Symptômes

Dans Microsoft Office Access 2007, Microsoft Office Access 2003 ou Microsoft Access 2002, vous ne pouvez pas modifier, ajouter ou supprimer des données dans des tableaux liés à un classeur Microsoft Excel.

En outre, vous pouvez rencontrer ce comportement lorsque l’une des conditions suivantes est remplie :

  • Vous créez une requête pour récupérer des données à partir de tables liées à un classeur Excel.
  • Vous créez un formulaire qui accède aux données des tableaux liés à un classeur Excel.
  • Vous utilisez DAO ou ADO pour mettre à jour par programmation les tables liées à un classeur Excel.

Le message suivant s’affiche lorsque vous exécutez une requête pour mettre à jour les enregistrements dans un classeur Excel lié :

L’opération doit utiliser une requête pouvant être mise à jour

Le message suivant s’affiche lorsque vous utilisez DAO pour mettre à jour par programme les tables liées à un classeur Excel :

Impossible de mettre à jour l’erreur d’exécution « 3027 ». La base de données ou l'objet est en lecture seule.

Lorsque vous essayez de mettre à jour les données liées dans ADO, le message est le même, mais le numéro d’erreur peut ressembler à ce qui suit :

-2147217911 (80040e09)

Lorsque vous exécutez une requête pour insérer des enregistrements dans un classeur Excel, vous recevez le message d’erreur suivant, même si le classeur Excel n’est pas lié à une base de données Access :

L’opération doit utiliser une requête pouvant être mise à jour

Cause

Ce comportement attendu se produit lorsque l’une des conditions suivantes est remplie :

  • Vous utilisez Office Access 2007.
  • Vous avez installé Microsoft Office 2003 Service Pack 2 (SP2) ou un Service Pack ultérieur ou toute mise à jour Access 2003 publiée après Office 2003 SP2.
  • Vous avez installé la mise à jour pour Access 2002 (KB904018) du 18 octobre 2005.
  • Vous avez installé une application de runtime Access qui inclut Microsoft Office 2003 Service Pack 2 (SP2) ou un Service Pack ultérieur, toutes les mises à jour Access 2003 publiées après Office 2003 SP2 ou la mise à jour pour Access 2002 (KB904018) datée du 18 octobre 2005 ou ultérieure.

Solution de contournement

Pour contourner ce comportement attendu, utilisez l’une des méthodes suivantes.

Méthode 1 : Utiliser Microsoft Excel

Ouvrez le classeur Excel lié dans Microsoft Excel, puis apportez vos modifications au classeur. Une fois les modifications effectuées, enregistrez-les, puis fermez le classeur.

Méthode 2 : Utiliser Office Access 2007, Access 2003 ou Access 2002

Importez le classeur Excel lié dans Access, puis apportez vos modifications aux données. Une fois les modifications effectuées, exportez les données sous la forme d’un fichier .xls Excel.

Pour exporter le tableau d’Access vers Excel, exécutez le code suivant dans 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

Remarque

Dans cet exemple de code, remplacez les espaces réservés suivants :

  • <AccessPath>

  • <ExcelPath>

  • <MyQuery>

    <MyQuery est un> espace réservé pour la requête que vous exécutez sur les tables de la base de données Access. Le résultat de la requête est exporté vers le classeur Excel.

  • <Feuilles>

    <Feuilles> de travail est un espace réservé pour la feuille de calcul excel vers laquelle vous souhaitez exporter le résultat. Pour exécuter cet exemple de code, appuyez sur Ctrl+G pour ouvrir la fenêtre Exécution , tapez WorkArounds, puis appuyez sur Entrée.

Informations supplémentaires

En raison de problèmes juridiques, Microsoft a désactivé les fonctionnalités d’Access 2003 et d’Access 2002 qui permettent aux utilisateurs de modifier les données des tableaux liés qui pointent vers une plage dans un classeur Excel. Toutefois, lorsque vous apportez des modifications directement dans le classeur Excel, les modifications apparaissent dans le tableau lié dans Access.