2016-04-13 21 views
0

通常、問題なく次のコードを実行できますが、レコードセット内のレコードが見つからないことがあります。ファイル自体は大きく、200k行以上です。さらに、いくつかのマージされたセルがあり、列の幅がオートフィッティングなしでデータを表示するのに十分な幅ではありません(どちらかが寄与する要素であるかどうかわかりません)。Excel/ADO:レコードセットへのアクセス中にエラーが発生する

:私も私のコードで成功した事例がここでエクセル2013

を実行しているマシンにされているのに対し、レコードが見つかっていない時間は、ほとんどが、エクセル2010を実行しているマシンにされていることを追加したいです

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 

上記の原因でエラーが発生したり、一般的にコードが改善されることがあります。どんなフィードバックも高く評価されます。ここで

は、データのサンプルです:

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

がエラーとは何ですか? – Parfait

+0

お返事ありがとうございます。 「レコードが見つかりません」というメッセージボックスが返されますが、コードはまったく同じファイルで正常に機能しているため、正しいとは限りません。 –

+0

if/thenロジックをBOFとEOFをrecordcount: 'If ORS.recordcount> 0 Then'に変更します。 – Parfait

答えて

1

構文的には、何もあなたのVBAのコードが間違っていません。単にSQLクエリのWHERE条件がレコードを返さないため、散発的に動作します。用示すように、あなたの投稿をサンプルデータF18とF25は列に、このようなWHERE句の値を持っていない:

Spreadsheet Input

あなたがWHERE条件を削除すると、すべてのレコードが返されます。

Spreadsheet Output

をおそらくワークシートの列の配置が異なるため、F18とF25が異なるフィールドを指している可能性があります。したがって、レコードセットを含むワークシートの部分だけでなく、列も明示的に参照することを検討してください。そのような列が各ワークシートまたはクエリーに存在することを確認してください。最後に、最初の行に列名が含ま示すために、接続文字列でHDR=Yesを指定します(会社、:

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

あなたは、SQL文の上にわかりますデータソースの繰り返し列名が原因で、いくつかの列名で接尾辞を番号付けしています各フィールドが一意に識別される必要があるため、JetSet/ACE SQLエンジンの接尾辞にレコードセットの番号を付けるコード、タイプ、名前、...)少なくとも

Spreadsheet Output without headers

最後になりました:会社、Company1の、Company2のは...また注意ください:HDR=Yesで、何のフィールド名はレコードになりません最初のインスタンスが何の数と増加接尾辞番号の後にすべてのものを持っていませんベストプラクティスは、常にランタイムエラーの明示的なメッセージを表示し、変数を確保するために、グローバル空間にOption Explicitを使用するようにコードを扱うエラーの、/オブジェクトが正しく宣言されています。それが失敗したとき

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

フィードバックに感謝します。私のコードは実際のヘッダーとワークシートの範囲を参照するようになりました。あなたの助けが大いにありがとう! –

+0

しばらくあなたから連絡がありませんでした。私はあなたがほとんどの新しいSOユーザーのように離陸したと思った!助けてうれしい! – Parfait

関連する問題