Update: ADO fügt Daten in die falschen Spalten in Excel

Veralteter Haftungsausschluss für KB-Inhalte

Dieser Artikel wurde für Produkte geschrieben, für die Microsoft keinen Support mehr anbietet. Deshalb wird dieser Artikel im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.

Problembeschreibung

Wenn Sie ADO verwenden, neue Datenzeilen in eine Microsoft Excel-Arbeitsblatt einfügen Daten Felder enthält, die leere Zeichenfolge enthalten, kann ADO die Datenwerte nachfolgende numerische Felder in die falschen Spalten in Excel einfügen.


Dieses Problem tritt in Microsoft OLE DB Provider für Jet, Version 4.0 und Microsoft ODBC-Treiber für Excel. Dieses Problem tritt auf, ob Sie eine SQL INSERT-Anweisung oder AddNew und Update -Methoden von ADO- Recordset -Objekt verwenden.


Dieses Problem tritt nicht auf, wenn die Excel-Arbeitsmappe in der Excel-Anwendung geöffnet ist, wenn ADO die neuen Datensätze eingefügt.


Microsoft rät jedoch dieser praktischen ab, da ein Speicherverlust tritt auf, wenn Excel bei ADO geöffnet ist.
Klicken Sie für Weitere Informationen auf die nachstehende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

Fehler 319998 : Speicherverlust beim Abfragen von geöffneten Excel-Arbeitsblatt mit ADO
Siehe Abschnitt "Weitere Informationen" Informationen über die Umstände dieses Problem.

Problemlösung

Um dieses Problem zu beheben, beziehen Sie das neueste Servicepack für Jet 4.0 Servicepack. Klicken Sie für Weitere Informationen auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:
239114 wie: erhalten Sie das neueste Servicepack für Microsoft Jet 4.0-Datenbank-Engine

Status

Microsoft hat bestätigt, dass es sich um einen Fehler in den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind.

Weitere Informationen

Schritte zum Reproduzieren des Verhaltens

  1. Öffnen Sie Microsoft Excel, und erstellen Sie eine neue Arbeitsmappe.
  2. Geben Sie in Tabelle1 die folgenden Beispieldaten beginnend mit Zelle A1 in der oberen linken Ecke:
    ColumnABColumnCColumnDColumnEColumnF
    11Testen11Testen
    22Testen22Testen

  3. Speichern Sie die Arbeitsmappe als Test.xls. Sie können die Excel-Anwendung geöffnet lassen, aber schließen Sie die neue Arbeitsmappe.
  4. Erstellen Sie in Microsoft Visual Basic ein neues Standard-EXE-Projekt Form1 wird standardmäßig erstellt.
  5. Klicken Sie im Menü Projekt auf Verweise. Wählen Sie aus der Liste der verfügbaren Referenzen Microsoft ActiveX Data-Objekten 2. X Bibliothek.
  6. Platzieren Sie eine Befehlsschaltfläche auf Form1 , und fügen Sie folgenden Code in die Click -Ereignisprozedur für die Schaltfläche. Beachten Sie, dass dieser Code eine leere Zeichenfolge in der mittleren Spalte Spalte c eingefügt
    Private Sub Command1_Click()   Dim strCn As String
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim fld As ADODB.Field

    'Open connection
    strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=" & App.Path & "\Test.xls;" & _
    "Extended Properties=Excel 8.0"
    Set cn = New ADODB.Connection
    cn.Open strCn

    'Add new values.
    Set rs = New ADODB.Recordset
    With rs
    .CursorLocation = adUseClient
    .Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
    .AddNew
    .Fields("ColumnA").Value = 3
    .Fields("ColumnB").Value = 3
    .Fields("ColumnC").Value = ""
    .Fields("ColumnD").Value = 3
    .Fields("ColumnE").Value = 3
    .Fields("ColumnF").Value = "testing"
    .Update
    .Close
    End With
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    End Sub

  7. Speichern Sie das Visual Basic-Testprojekt in demselben Ordner wie die Arbeitsmappe Test.xls.
  8. Führen Sie das Projekt, und klicken Sie dann auf die Schaltfläche. Beim ersten Ausführen des Projekts in der Visual Basic IDE Integrated Development Environment (), erhalten Sie folgende Fehlermeldung:
    Laufzeitfehler '-2147467259 (80004005)': ausgewählte Sortierfolge vom Betriebssystem nicht unterstützt.
    Dies ist ein bekanntes Problem. Weitere Informationen finden Sie der Microsoft Knowledge Base:

    246167 sortieren Sequenz Fehler öffnen ADODB Recordset erstmals für Excel XLS
  9. Klicken Sie im Dialogfeld Fehler Nachricht auf Debuggen, und drücken Sie F5, um das Projekt weiter. Beachten Sie, dass diese zwei neue Zeilen mit Daten nicht eingefügt, weil Update zweimal ausgeführt wird.
  10. Das Formular, um das Projekt zu schließen. Öffnen Sie Test.xls in Excel und überprüfen Sie die Daten in Sheet1. Die folgenden Ergebnisse zu erwarten:

    ColumnABColumnCColumnDColumnEColumnF
    11Testen11Testen
    22Testen22Testen
    3333Testen

    Sehen Sie jedoch die folgenden Daten:

    ColumnABColumnCColumnDColumnEColumnF
    11Testen11Testen
    22Testen22Testen
    3333Testen

    Es wird als leere Zeichenfolge ColumnC eingefügt ignoriert wurde und verschwunden. Daher sind nachfolgende Zahlenwerte eingefügten eine Spalte links neben die vorgesehenen Ziele. Die nachfolgende Zeichenfolgenspalte ist nicht betroffen.

Variante 1

Konfigurieren Sie die Daten wie folgt:

ColumnABColumnCColumnDColumnE
1Testen11Testen
2Testen22Testen

Im Visual Basic-Projekt ändern Sie den Abschnitt um neue Werte wie folgt hinzufügen:
   'Add new values.   Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
.AddNew
.Fields("ColumnA").Value = 3
.Fields("ColumnB").Value = ""
.Fields("ColumnC").Value = 3
.Fields("ColumnD").Value = 3
.Fields("ColumnE").Value = "testing"
.Update
.Close
End With
Set rs = Nothing
cn.Close
Set cn = Nothing

Wenn Sie Test.xls in Excel öffnen, zeigt Tabelle1 die folgenden Daten:

ColumnABColumnCColumnDColumnE
1Testen11Testen
2Testen22Testen
333Testen

Beachten Sie, dass dieses Problem nicht auftritt, wenn eine numerische Spalte den Wert leere Zeichenfolge vorausgeht.

Variante 2

Konfigurieren Sie die Daten wie folgt:

ColumnABColumnCColumnDColumnEColumnFColumnG
11TestenTesten11Testen
22TestenTesten22Testen

Im Visual Basic-Projekt ändern Sie den Abschnitt um neue Werte wie folgt hinzufügen:
   'Add new values.   Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.Open "Select * from [Sheet1$]", cn, adOpenStatic, adLockOptimistic
.AddNew
.Fields("ColumnA").Value = 3
.Fields("ColumnB").Value = 3
.Fields("ColumnC").Value = ""
.Fields("ColumnD").Value = ""
.Fields("ColumnE").Value = 3
.Fields("ColumnF").Value = 3
.Fields("ColumnG").Value = "testing"
.Update
.Close
End With
Set rs = Nothing
cn.Close
Set cn = Nothing

Wenn Sie Test.xls in Excel öffnen, zeigt Tabelle1 die folgenden Daten:

ColumnABColumnCColumnDColumnEColumnFColumnG
11TestenTesten11Testen
22TestenTesten22Testen
3333Testen

ADO fügt zwei leere Zeichenfolgenwerte ein, scheint die leeren Zeichenfolgen ColumnC und ColumnD eingefügt werden ignoriert und sind verschwunden. Daher werden nachfolgende Zahlenwerte eingefügten Spalten links ihre beabsichtigten Ziele. Die nachfolgende Zeichenfolgenspalte ist nicht betroffen.

Referenzen

Weitere Informationen finden Sie zu die Artikeln der Microsoft Knowledge Base:

294410 ACC2002: Exportieren nach Excel mit Daten des angrenzenden Feldes ersetzte NULL-Werte
257819 so wird's gemacht: Verwenden von ADO mit Excel-Daten von Visual Basic oder VBA
Eigenschaften

Artikelnummer: 314763 – Letzte Überarbeitung: 21.01.2017 – Revision: 1

Feedback