2015-08-25 17 views
0

环路我试图通过所有记录在一个访问表运行使用嵌套do ... while循环。嵌套做....而在访问VBA

还有就是不同的标准,每个循环之前,我跑的圈,所以我打开了多个记录。

当我运行的代码,这是工作,因为它应该,但问题是当记录集的1没有记录整个过程失败。

这里是代码嵌套循环位。

Dim rst1, rst2, rst3, rst4, rst5, rst6 As Recordset 
Dim sqlSt1, sqlSt2, sqlSt3, sqlSt4, sqlSt5, sqlSt6 As String 
Dim rcdCount, a, b, c, d, e, f As Double 

Set dbs = CurrentDb 
sqlSt1 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 1" 
sqlSt2 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 2" 
sqlSt3 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 3" 
sqlSt4 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 4" 
sqlSt5 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 5" 
sqlSt6 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 6" 

Set rst1 = dbs.OpenRecordset(sqlSt1) 
Set rst2 = dbs.OpenRecordset(sqlSt2) 
Set rst3 = dbs.OpenRecordset(sqlSt3) 
Set rst4 = dbs.OpenRecordset(sqlSt4) 
Set rst5 = dbs.OpenRecordset(sqlSt5) 
Set rst6 = dbs.OpenRecordset(sqlSt6) 

startTime = Time 

rcdCount = rst1.recordCount 
SysCmd acSysCmdInitMeter, "Processing: ", rcdCount 

Debug.Print "4: " & rst4.recordCount 
Debug.Print "6: " & rst6.recordCount 


Do While Not rst1.EOF And Not rst1.BOF 
    Do While Not rst2.EOF And Not rst2.BOF 
     Do While Not rst3.EOF And Not rst3.BOF 
      Do While Not rst4.EOF And Not rst4.BOF 
       Do While Not rst5.EOF And Not rst5.BOF 
        Do While Not rst6.EOF And Not rst6.BOF 

         f = f + 1 
         rst6.MoveNext 
        Loop 

        e = e + 1 
        rst6.MoveFirst 
        rst5.MoveNext 
       Loop 

       d = d + 1 
       rst5.MoveFirst 
       rst4.MoveNext 
      Loop 

      c = c + 1 
      rst4.MoveFirst 
      rst3.MoveNext 
     Loop 

     b = b + 1 
     rst3.MoveFirst 
     rst2.MoveNext 
    Loop 

    a = a + 1 
    SysCmd acSysCmdUpdateMeter, a 
    DoEvents 

    rst2.MoveFirst 
    rst1.MoveNext 
Loop 
rst1.Close 
rst2.Close 
rst3.Close 
rst4.Close 
rst5.Close 
rst6.Close 

SysCmd acSysCmdRemoveMeter 

endTime = Time 

tmDuration = DateDiff("s", CDate(startTime), CDate(endTime)) 
tm = Format(Int([tmDuration]/3600), "00") & ":" & Format(Int(([tmDuration] - (Int([tmDuration]/3600) * 3600))/60), "00") & ":" & Format((([tmDuration] Mod 60)), "00") 

Debug.Print a 
Debug.Print b 
Debug.Print c 
Debug.Print d 
Debug.Print e 
Debug.Print f 
Debug.Print "-----------------" 
Debug.Print tm 

有没有简单的方法,我可以检查空记录,并跳过那些会导致问题的?

感谢所有帮助

ķ

+1

通过“空记录”我想你的意思是空记录。检查是否rst#.eof = false。我会重构这个,所以它们并不都是这样嵌套的。如果你发布了更多的代码,也许有人可以提出更好的逻辑。 – MatthewD

+1

“整个过程失败”并没有告诉我们什么。告诉我们什么是错的。此外,向我们展示实际的代码失败,因为上面看起来是正确的。 – RBarryYoung

+0

当它失败时,该表实际上是否存在于记录集中? –

回答

0

似乎所有你想要的是计数。为什么不使用公式而不是循环。

f = rst6.recordcount * rst5.recordcount * ... 
e = rst5.recordcount * rst4.recordcount * ... 

对于所有六个变量都这样做。意识到如果rst4.recordcount为0,那么你会得到0为d,e,f。但顺便说一句,你正在编码,这是你想要的。

0

为寻找谢谢你们,我昨天实现了代码实际上,它应该工作,如果有0个记录中的任何记录集那么它不应该反正运行嵌套循环。

再次感谢。