2016-04-13 9 views
0

Ich kann den folgenden Code normalerweise ohne Problem ausführen, aber es kann manchmal keine Datensätze im Datensatz finden. Die Datei selbst ist groß - über 200k Zeilen. Außerdem hat es einige verbundene Zellen, und die Spaltenbreiten sind nicht breit genug, um die Daten ohne automatische Anpassung anzuzeigen (ich bin nicht sicher, ob einer dieser Faktoren ein Faktor sein könnte). Ich würde auch, dass die Zeit hinzufügen, keine Datensätze gefunden wurden, sind auf einer Maschine meist läuft Excel 2010, während die erfolgreichen Instanzen auf einem Rechner ausgeführt Excel gewesen 2013.Excel/ADO: Fehler beim Zugreifen auf Recordset

Hier ist mein Code:

Gibt es irgendetwas, was Sie sehen, das das oben genannte manchmal scheitern könnte, oder das den Code im Allgemeinen verbessern würde? Jede Rückmeldung wird sehr geschätzt. Hier

ist eine Probe der Daten:

Company Name                             

Company Name                             

Company Info                             

Accounting Date: 04/12/2016                           

Company Code Company Code Type Group TP RES Band Name Arrival Date Departure Date ACCTING CENTER1 ACCTING CENTER2 Center Name GL AL Tran Type Name Acctng Tran Type Name Natural Posting Item Name Creation User Id SAP Account Name Paymnet Method Document Number Payment Originator Name Natural Posting Amt ID Acctng Tran Id Natural GL Acct Nbr Natural CAC Id PAY ID ID Totals 
222 7887878 Master 4696941 0 4696941  random name 04/09/2016 04/23/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 5857 0000121046 4 1616165 649848 
777 7768 Master 7575 0 783783  random name 12/01/2015 02/26/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 8778 0000121046 5 6168161 128572150 
783783 4696941 Master 4696941 0 783783  random name 04/09/2016 04/25/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 8 0000121046 7 198816313 5464  
4696941 78666 Master 4696941 0 4696941  random name 04/10/2016 04/22/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 1097152750 0000121046 3 171984 5616  
78 4696941 Master 786 0 783783  random name 02/19/2016 03/04/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 27217 0000121046 1 515678 115616 
66 786 Master 4696941 0 78378  random name 04/02/2016 04/06/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 4177 0000121046 2 56468 117980742 
22 666/// Master 4696941 0 42753  random name 04/09/2016 04/29/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 9 0000121046 32 198805200 42742 
783 86788 Master 4696941 0 4696941  random name 04/01/2016 04/17/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 879 0000121046 7 254948 1561  
66676 4696941 Master 4696941 0 4696941  random name 02/29/2016 03/15/2016 Undistributed Undistributed Company Info  REC   Ledger RE Ledger CC ******* random name 4696941 4696941 78 0000121046 7 45618 615 
+0

Was der Fehler ist, wenn es nicht funktioniert? – Parfait

+0

Danke für die Antwort. Es gibt das Meldungsfeld "No records found" zurück, aber das kann nicht stimmen, da der Code in der gleichen Datei erfolgreich ausgeführt wurde. –

+0

Ändern Sie Ihre Wenn-Dann-Logik von BOF und EOF zu Recordcount: 'If ORS.recordcount> 0 Then'. – Parfait

Antwort

1

syntaktisch, nichts ist falsch mit Ihrem VBA-Code. Die WHERE-Bedingung Ihrer SQL-Abfrage gibt keine Datensätze zurück, weshalb sie sporadisch funktioniert. Für Ihre geposteten Beispieldaten F18 und F25 haben nicht so WHERE Klausel Werte in den Spalten wie folgt:

Spreadsheet Input

Wenn Sie die WHERE Zustand alle Datensätze zurückgegeben werden entfernen:

Spreadsheet Output

Möglicherweise können sich Arbeitsblätter in der Anordnung der Spalten unterscheiden, so dass F18 und F25 auf verschiedene Felder zeigen können. Berücksichtigen Sie daher explizit den Verweis auf Spalten sowie den Teil des Arbeitsblatts, das das Recordset enthält. Stellen Sie sicher, dass solche Spalten in jedem Arbeitsblatt vorhanden sind oder die Abfrage fehlschlägt. Schließlich gibt HDR=Yes in Verbindungszeichenfolge erste Zeile enthält Spaltennamen angeben:

sSQL = "select [Company1], [Group], [RES], [Band], [Name1]," _ 
      & " [CENTER2], [AL], [Tran], [Type2]" _ 
      & " from [Natural Detail$A10:BL19]" _ 
      & " where [CENTER2]='0000121046' or [Name2]='Natural GL Acct Nbr'" 
... 
oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & DBpath & "';" & _ 
       "Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";" 

Sie oben SQL-Anweisung feststellen, wird von einigen Spaltennamen nummerieren Suffixe, die auf die wiederholten Spaltennamen in Datenquelle zurückzuführen ist: (Firma, Code, Type, Name, ...), die die Jet/ACE SQL Engine mit einer Nummer im Recordset suffiziert, da jedes Feld eindeutig identifiziert werden muss. Erste Instanz hat keine Nummer und jeden nach mit zunehmenden nachgestellten Zahlen: Unternehmen, Company1, Company2 ... auch Sie Folgendes beachten: mit HDR=Yes, werden keine Feldnamen in Cord-Folge:

Spreadsheet Output without headers

Last but not least für best Practices immer Ihren Code Fehler behandelt explizite Meldung von Laufzeitfehlern zu zeigen und Option Explicit in globalem Raum verwenden, um Variablen/Objekte sicherzustellen, ordnungsgemäß deklariert:

Option Explicit 

Sub RunSQL() 
On Error GoTo ErrHandle 
    Dim oConn As New ADODB.Connection 
    Dim oRS As New ADODB.Recordset 

    ... 
    oRS.Close 
    oConn.Close 
    Set oConn = Nothing 
    Exit Sub 

ErrHandle: 
    MsgBox Err.Number & " - " & Err.Description, vbCritical, "RUNTIME ERROR" 
    Exit Sub 
End Sub 
+0

Danke für die Rückmeldung. Mein Code verweist jetzt auf die tatsächlichen Kopfzeilen und den Arbeitsblattbereich, und bis jetzt funktioniert es großartig. Deine Hilfe ist sehr Willkommen! –

+0

Ich habe seit einiger Zeit nichts mehr von dir gehört. Ich dachte, du würdest wie die meisten neuen SO-Benutzer abheben! Froh, dass ich Helfen kann! – Parfait

Verwandte Themen