PRB: "Vorgang muss eine aktualisierbare Abfrage verwenden" Beim Zugriff auf Excel über ODBC

Symptome

Wenn Sie ein Excel-Arbeitsblatt über ADO und ODBC bearbeiten, erhalten Sie möglicherweise die folgende Fehlermeldung, wenn Sie ein ADO DataControl-Objekt verwenden:

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

Wenn Sie ein Recordset-Objekt verwenden, das mit ADO-Code generiert wird, erhalten Sie möglicherweise die folgende Fehlermeldung, wenn Sie ein Excel-Arbeitsblatt über ADO und ODBC bearbeiten:

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

Ursache

Dieses Problem tritt auf, wenn Sie versuchen, ein Arbeitsblatt zu bearbeiten, das als ReadOnly gespeichert oder geöffnet wird.

Hinweis

ReadOnly ist die Standardeinstellung für eine ODBC-Verbindung mit Excel, mit oder ohne Datenquellenname (DATA Source Name, DSN). Daher muss der Benutzer diese Einstellung immer ändern, um Daten zu bearbeiten.

Lösung

Verwenden Sie die folgenden Methoden, um dieses Problem zu beheben:

  • Stellen Sie sicher, dass die LockType-Eigenschaft des Recordset-Objekts nicht auf ReadOnly festgelegt ist.

  • Stellen Sie sicher, dass die Datei, die Sie öffnen möchten, nicht als ReadOnly gespeichert ist.

  • Wenn Sie eine Verbindung über einen DSN herstellen, führen Sie die folgenden Schritte aus:

    1. Öffnen Sie Systemsteuerung, und klicken Sie dann auf ODBC-Datenquellenadministrator.
    2. Doppelklicken Sie auf Ihren DSN.
    3. Klicken Sie im Dialogfeld ODBC Microsoft Excel-Setup auf Optionen.
    4. Stellen Sie sicher, dass das Kontrollkästchen ReadOnly nicht aktiviert ist.
  • Wenn Sie eine DSN-keine Verbindung verwenden, stellen Sie sicher, dass Sie die Option "ReadOnly=0" in die Verbindungszeichenfolge einschließen. Beispiel:

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

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Erstellen Sie ein neues Standard-EXE-Projekt in Visual Basic.

  2. Klicken Sie im Menü Projekt auf Verweise, und fügen Sie dann einen Verweis auf die Microsoft ActiveX-Datenobjektbibliothek hinzu.

  3. Fügen Sie Form1 eine Befehlsschaltfläche hinzu.

  4. Fügen Sie form1 den folgenden Code hinzu:

    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. Speichern Sie die Anwendung.

  6. Erstellen Sie ein neues Excel-Arbeitsblatt, und speichern Sie das Arbeitsblatt als Test.xls.

  7. Zeigen Sie im Menü Einfügen auf Name, und klicken Sie dann auf Definieren.

  8. Erstellen Sie eine neue Tabelle im Excel-Arbeitsblatt, und nennen Sie die Tabelle dann TB1.

  9. Speichern Sie das Arbeitsblatt im selben Ordner wie die Visual Basic-Anwendung.

  10. Drücken Sie F5, um die Anwendung auszuführen.

References

Weitere Informationen finden Sie im folgenden Artikel:

Büroraum: Tipps und Tricks zum Erstellen von Skripts für Microsoft Office-Anwendungen