2017-05-11 10 views
0

RecordSetループが別のRecordSetループ内にあります。 .OpenRecordSetが実行されるのに45秒かかるとうまくいけば、うまくいくでしょう。そして、それが開くテーブルには445kのレジスタがあります。VBaのレコードセットによるループ処理が遅すぎる

内部ループの理由は、別のRecordSetから取得した結果をフィルタリングしてから、これらの新しい結果を取得して比較する必要があるためです。

他の方法などを使用する方が良いでしょうか?特定のデータをテーブルから取得する別の方法がありますか(もちろん、より速い方法)?私はマルチスレッドを試すべきですか?

の人が私のコードが必要になる場合がありますので:

Private Sub btnGetQ_Click() 
    Dim tabEQ As DAO.Recordset: Dim tabT7 As DAO.Recordset: Dim tabPesqC As DAO.Recordset: Dim PesqCqdf As DAO.QueryDef 
    Dim index As Integer: Dim qtdL As Long: Dim qtdL2 As Long 
    Dim arrC() As String: Dim arrC2() As String: Dim arrC3() As String 

    Set tabEQ = dbC.OpenRecordset("EQuery", dbOpenSnapshot) 
    Set tabT7 = dbC.OpenRecordset("T7Query", dbOpenSnapshot) 
    If Not tabEQ.EOF Then 
     tabEQ.MoveFirst 
     qtdL = tabEQ.RecordCount - 1 
     ReDim arrC(qtdL): ReDim arrC2(qtdL) 

     If Not tabT7.EOF Then 
      tabT7.MoveFirst: index = 0 
      Do Until tabT7.EOF 
       arrC(index) = tabT7.Fields("CCO"): arrC2(index) = tabT7.Fields("CCE") 

       Set PesqCqdf = dbC.QueryDefs("pesqCCO") 
       PesqCqdf.Parameters("CCO") = arrC(index) 
       Set tabPesqC = PesqCqdf.OpenRecordset(dbOpenSnapshot) 

       qtdL2 = tabPesqConj.RecordCount - 1 

       If qtdL2 > 0 Then 
        ReDim arrC3(qtdL2) 

        Dim i As Integer 
        For i = 0 To UBound(arrC3) 
         arrC3(i) = tabPesqC.Fields("CCE") 
         tabPesqC.MoveNext 
        Next 
       End If 

       On Error GoTo ERROR_TabT7 

       index = index + 1: tabT7.MoveNext 
      Loop 
     End If 

ERROR_TabT7: 
Set tabT7 = Nothing 

End If 
If IsObject(tabEQ) Then Set tabEQ = Nothing 

End Sub 
+0

VBAマルチスレッドをサポートしていません。 –

+1

SQLを使用してみてください。詳細については、より詳細な情報をご提供ください。単純化されたソースレコードセットを使用してサンプルを投稿し、そのアイデアを示すために出力することもできます。レコードセットのソースは何ですか、レコードセットの接続が解除されていますか?どのような種類のフィルタリングを適用する必要がありますか? – omegastripes

+0

ソースはネイティブテーブルです –

答えて

0

私は私が望んでリンクテーブルを作成しました:/

関連する問題