Oprava: ADO vloží Data do nesprávného sloupce v aplikaci Excel

Prohlášení o odmítnutí odpovědnosti pro už nepodporovaný obsah KB

Tento článek byl napsán pro produkty, ke kterým již Microsoft nadále nenabízí podporu. Článek je tedy poskytován „tak, jak je“ a nebude už nadále aktualizován.

Příznaky

Při použití objektů ADO ke vkládání nových řádků dat do listu aplikace Microsoft Excel, pokud data obsahují pole, která obsahují hodnoty prázdný řetězec ADO může vložit hodnoty dat následných číselná pole do nesprávné sloupce v aplikaci Excel.


K tomuto problému dochází v Microsoft OLE DB Provider for Jet verze 4.0 a ovladač Microsoft ODBC pro aplikaci Excel. K tomuto problému dochází, zda použijete příkaz INSERT jazyka SQL nebo AddNew a metody Update objektu ADO Recordset .


Tento problém se nevyskytuje, je-li sešit aplikace Excel je otevřen v aplikaci Excel, pokud ADO vloží nové záznamy.


Ale odrazuje Microsoft je od této praxe, protože nevracení paměti dochází, pokud aplikace Excel je otevřen během operací ADO.
Další informace získáte klepnutím na níže uvedené číslo článku znalostní báze Microsoft Knowledge Base:

319998 Chyba: nevracení paměti při dotazu otevřít aplikace Excel sešit s objekty ADO
Naleznete v části "Další informace" podrobné informace o případech, ve kterých k tomuto problému dochází.

Řešení

Tento problém vyřešíte pomocí nejnovější aktualizace service pack pro stroj Jet 4.0 service pack. Další informace získáte kliknutím na následující číslo v článku databáze Microsoft Knowledge Base:
239114 jak: získat nejnovější Service Pack pro databázový stroj Microsoft Jet 4.0

Stav

Společnost Microsoft potvrzuje, že se jedná o problém v produktech této společnosti uvedených na začátku tohoto článku.

Další informace

Kroky pro reprodukci chování

  1. Otevřete aplikaci Microsoft Excel a potom vytvořit nový sešit.
  2. V listu List1 zadejte následující ukázková data, počínaje v levém horním rohu buňky A1:
    ColumnAColumnBColumnCColumnDColumnEColumnF
    11testování11testování
    22testování22testování

  3. Uložte sešit jako Test.xls. Aplikace Excel můžete nechat otevřené, ale musíte zavřít nový sešit.
  4. V aplikaci Microsoft Visual Basic vytvořte nový projekt Standardní EXE. Ve výchozím nastavení je vytvořen formulář Form1.
  5. V nabídce projekt klepněte na odkazy. V seznamu dostupné odkazy vyberte Microsoft ActiveX Data objekty 2 . x knihovny.
  6. Umístěte ovládací prvek CommandButton na Form1 a vložte následující kód v proceduře události klepněte na tlačítko. Všimněte si, že tento kód vloží prázdný řetězec do prostředním sloupci sloupec C.
    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. Uložte projekt jazyka Visual Basic test ve stejné složce jako sešit, Test.xls.
  8. Spuštění projektu a klepněte na tlačítko. Při prvním spuštění projektu v Visual Basic integrované vývojové prostředí (IDE), můžete obdržet následující chybovou zprávu:
    Chyba spuštění '-2147467259 (80004005)': vybraný operační systém nepodporuje pořadí řazení
    Jedná se o známý problém. Další informace získáte klepnutím na níže uvedené číslo článku znalostní báze Microsoft Knowledge Base:

    246167 kompletování sekvence chyba otevírání ADODB Recordset poprvé proti aplikace Excel XLS
  9. V dialogovém okně chybové zprávy klepnutím na odkaz Debuga potom stiskněte klávesu F5 ke spuštění projektu pokračovat. Poznámka: to vloží dva nové řádky dat místo jednoho, protože je aktualizace spustit dvakrát.
  10. Zavřete formulář ukončení projektu. Znovu otevřete Test.xls v aplikaci Excel a zkontrolujte data v listu List1. Očekáváte následující výsledky:

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11testování11testování
    22testování22testování
    3333testování

    Však zobrazí následující údaje:

    ColumnAColumnBColumnCColumnDColumnEColumnF
    11testování11testování
    22testování22testování
    3333testování

    Zobrazí se jako prázdný řetězec, který je vložen do ColumnC byla ignorována a zmizel. Proto všechny následné číselné hodnoty jsou vložené jeden sloupec vlevo od jejich zamýšleného cíle. Ve sloupci následující řetězec není ovlivněn.

Varianta 1

Konfigurace testovací data takto:

ColumnAColumnBColumnCColumnDColumnE
1testování11testování
2testování22testování

V projektu aplikace Visual Basic k úpravě oddílu přidáte nové hodnoty:
   '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

V aplikaci Excel otevřete Test.xls, zobrazí se následující data List1:

ColumnAColumnBColumnCColumnDColumnE
1testování11testování
2testování22testování
333testování

Všimněte si tento problém se nevyskytuje Pokud jeden číselný sloupec předchází hodnotu prázdný řetězec.

Varianta 2

Konfigurace testovací data takto:

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11testovánítestování11testování
22testovánítestování22testování

V projektu aplikace Visual Basic k úpravě oddílu přidáte nové hodnoty:
   '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

V aplikaci Excel otevřete Test.xls, zobrazí se následující data List1:

ColumnAColumnBColumnCColumnDColumnEColumnFColumnG
11testovánítestování11testování
22testovánítestování22testování
3333testování

Pokud ADO vloží dvě hodnoty prázdný řetězec, zobrazí se jako prázdné řetězce, které jsou vloženy do ColumnC a ColumnD jsou ignorovány a nejsou k dispozici. Proto všechny následné číselné hodnoty jsou vložené dva sloupce nalevo od jejich zamýšleného cíle. Ve sloupci následující řetězec není ovlivněn.

Odkazy

Další informace získáte v následujících článcích znalostní báze společnosti Microsoft:

294410 ACC2002: použití hodnot Null nahrazena další pole dat při exportu do aplikace Excel
257819 postupy: použití objektů ADO s daty aplikace Excel z aplikace Visual Basic nebo VBA
Vlastnosti

ID článku: 314763 - Poslední kontrola: 20. 1. 2017 - Revize: 1

Váš názor