Partager via


Erreur « L’opération doit utiliser une requête pouvant être mise à jour » Lorsque vous accédez à Excel via ODBC

Symptômes

Lorsque vous modifiez une feuille de calcul Excel via ADO et ODBC, vous pouvez recevoir le message d’erreur suivant si vous utilisez un objet Ado DataControl :

[Microsoft][ODBC Excel Driver] Operation must use an updateable query.

Si vous utilisez un objet Recordset généré avec du code ADO, vous pouvez recevoir le message d’erreur suivant lorsque vous modifiez une feuille de calcul Excel via ADO et ODBC :

Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.

La cause

Ce problème se produit si vous essayez de modifier une feuille de calcul enregistrée ou ouverte en tant que ReadOnly.

Remarque

ReadOnly est le paramètre par défaut d’une connexion ODBC à Excel, avec ou sans nom de source de données (DSN). Par conséquent, l’utilisateur doit toujours modifier ce paramètre pour modifier les données.

Résolution

Pour résoudre ce problème, utilisez les méthodes suivantes :

  • Vérifiez que la propriété LockType de l’objet Recordset n’est pas définie sur ReadOnly.

  • Assurez-vous que le fichier que vous essayez d’ouvrir n’est pas enregistré en tant que ReadOnly.

  • Si vous vous connectez via un DSN, procédez comme suit :

    1. Ouvrez le Panneau de configuration, puis sélectionnez Administrateur de source de données ODBC.
    2. Double-cliquez sur votre DSN.
    3. Dans la boîte de dialogue Configuration d’ODBC Microsoft Excel, sélectionnez Options.
    4. Vérifiez que la case à cocher ReadOnly est désactivée.
  • Si vous utilisez une connexion sans DSN, veillez à inclure l’option « ReadOnly=0 » dans la chaîne de connexion. Par exemple:

    cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
    

Statut

Ce comportement est voulu.

Plus d’informations

Étapes de reproduction du comportement

  1. Créez un projet EXE standard en Visual Basic.

  2. Dans le menu Projet, sélectionnez Références, puis ajoutez une référence à la bibliothèque Microsoft ActiveX Data Objects.

  3. Ajouter un bouton Commande à Form1.

  4. Ajoutez le code suivant à Form1 :

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    
    Private Sub Form_Load()
      Command1.Caption = "Edit"
    End Sub
    
    Private Sub Command1_Click()
      Dim DocPath As String
    
      DocPath = App.Path & "\Test.xls"
    
      Set cn = New Connection
      Set rs = New Recordset
    
      cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & DocPath & ";ReadOnly=1"
      rs.LockType = adLockOptimistic
      rs.Open "TB1", cn
      rs.AddNew
      rs.Fields(1).Value = "New Value"
      rs.Update
    
      rs.Close
      cn.Close
      Set rs = Nothing
      Set cn = Nothing
    End Sub  
    
  5. Enregistrez l’application.

  6. Créez une feuille de calcul Excel, puis enregistrez la feuille de calcul en tant que Test.xls.

  7. Dans le menu Insertion, pointez sur Nom, puis sélectionnez Définir.

  8. Créez un tableau dans la feuille de calcul Excel, puis nommez le tableau TB1.

  9. Enregistrez la feuille de calcul dans le même dossier que l’application Visual Basic.

  10. Appuyez sur F5 pour exécuter l’application.

références

Pour plus d’informations, consultez Office Space : conseils et astuces pour l’écriture de scripts d’applications Microsoft Office.