2016-04-13 18 views
0

Genellikle aşağıdaki kodu sorun olmadan çalıştırabilirim, ancak bazen kayıt kümesinde herhangi bir kayıt bulamadı. Dosyanın kendisi büyük - 200k satırın üzerinde. Buna ek olarak, bazı birleştirilmiş hücreler vardır ve sütun genişlikleri otomatik uyumu olmayan verileri görecek kadar geniş değildir (bunlardan herhangi birinin katkıda bulunan bir faktör olup olmadığından emin değilim).Excel/ADO: Hata Kayıt kümesine erişme

: Ben de başarılı örneklerini Excel 2013 Burada

çalıştıran bir makinede olmuştur, oysa hiçbir kayıt çoğunlukla Excel 2010 çalıştıran bir makinede olmuştur bulunmuştur zamanlarda o eklemek istiyorum benim kodudur

Dim oConn As New ADODB.Connection 
Dim oRS As New ADODB.Recordset 
Dim sPath 
Dim sSQL As String 
Dim fd As Office.FileDialog 
Dim fr11 As String 

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "FR11". 

sSQL = "select F3,F6,F8,F9,F10,F18,F22,F23,F28 from [Natural Detail $] where F18 = '0000121046' or F25 = 'Natural GL Acct Nbr'" 

Set fd = Application.FileDialog(msoFileDialogFilePicker) 

    With fd 

     .AllowMultiSelect = False  
     .Title = "Please select the file." box. 
     .Filters.Clear 
     .Filters.Add "Excel", "*.xlsx" 
     .Filters.Add "All Files", "*.*" 


     If .Show = True Then 
     fr11 = .SelectedItems(1) 

     End If 
    End With 

DBPath = fr11 

oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & DBPath & "';" & _ 
       "Extended Properties='Excel 12.0 Xml;HDR=No;IMEX=1;MaxScanRows=0';" 

oRS.Open sSQL, oConn 

If Not (oRS.BOF And oRS.EOF) Then 
     Worksheets("FR11").Range("A1").CopyFromRecordset oRS 
    Else 
     MsgBox "No records found" 
    End If 

    oRS.Close 
    oConn.Close 
    Set oConn = Nothing 

Yukarıdakilerin bazen başarısız olmasına neden olabilecek veya genel olarak kodu artırabilecek herhangi bir şey var mı? Herhangi bir geri bildirim çok takdir edilmektedir.

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

hatası nedir? – Parfait

+0

Yanıt için teşekkürler. "Kayıt bulunamadı" ileti kutusu döndürür, ancak kod aynı dosya üzerinde başarıyla çalıştığı için bu doğru olamaz. –

+0

if/o zaman mantığınızı BOF ve EOF kullanarak kayıt sayısını değiştirin: 'ORS.recordcount> 0 O zaman. – Parfait

cevap

1

Sözdizimsel olarak, hiçbir şey VBA kodu ile yanlıştır: Burada

verilerin bir örneğidir. Sadece SQL sorgunun WHERE durum kayıtlarını döndürmez ve bu nedenle neden düzenli olarak çalışır. gösterildiği gibi nakledilen örnek veri F18 ve F25 için sütunlarda böyle WHERE fıkra değerlerini yok:

Spreadsheet Input

tüm kayıtlar döndürülür WHERE koşulunu kaldırırsanız:

Spreadsheet Output

Muhtemelen, çalışma sayfaları sütunların düzenlenmesinde farklılık gösterebilir, bu yüzden F18 ve F25 farklı alanlara işaret edebilir. Bu nedenle, kayıt kümesini içeren çalışma sayfasının yanı sıra sütunlara açıkça başvurmayı da düşünün. Her çalışma sayfasında böyle sütunlar bulunduğundan emin olun veya sorgu başarısız olur. veri kaynağında tekrarlanan sütun adları kaynaklanmaktadır bazı sütun adlarıyla SQL deyimi yukarıda göreceksiniz

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;"";" 

sayılı etti ekleri: Son olarak, ilk satırı belirtmek için bağlantı dizesinde HDR=Yes belirtmek Sütun adlarını içeren (Şirket, Kod, Tür, İsim, ...) Jet/ACE SQL Engine'in her alanın benzersiz bir şekilde tanımlanması gerektiğinden, kayıt kümesindeki bir sayı ile eklenir. İlk örneği hiçbir numarayı ve artan suffixed sayılarla sonraki her birine sahiptir: Şirket, şirket1'e, Company2 ... Ayrıca dikkat do: HDR=Yes ile hiçbir alan adları kayıt sonuçlanır:

Spreadsheet Output without headers

Son olarak en iyi uygulamalar her çalışma zamanı hatası açık mesajı göstermek ve değişkenleri sağlamak için küresel alanda Option Explicit uygulamak için kodunuzu işlemek hata için,/nesneler düzgün beyan edilir: İşlem başarısız olduğunda

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

Geri bildirim için teşekkürler. Kodum şimdi gerçek başlıklara ve çalışma sayfası aralığına referans veriyor ve şu ana kadar harika çalışıyor. Yardımınız çok takdir ediliyor! –

+0

Bir süredir senden haber alamadım. En yeni SO kullanıcıları gibi çıktığını sanıyordum! Yardım ettiğim için sevindim! – Parfait

İlgili konular