如何使用Do While Loop编写VBA?

时间:2013-07-11 14:40:55

标签: vba ms-access loops access-vba

我有一个包含3个字段的表格:DONOR_CONTACT_ID, RECIPIENT_CONTACT_IDORDER_NUMBER。我想按照我的查询DONOR_CONTACT_ID按升序排序Q_RECIPIENT_SORT。然后我想使用临时变量来检查记录是否具有相同的DONOR_CONTACT_ID,然后显示一条消息(大多数记录具有相同的DONOR_CONTACT_ID)。我的程序完成它应该做的一切,但最后它总是会出现一个错误,上面写着“No Current Record”。这是我的代码:

Option Compare Database
Option Explicit


Function UsingTemps()

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strTemp1 As Long
Dim strTemp2 As Long

DoCmd.SetWarnings False
DoCmd.OpenQuery ("Q_RECIPIENT_SORT")
DoCmd.OpenTable ("T_RECIPIENT_SORT")
DoCmd.SetWarnings True
Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("T_RECIPIENT_SORT", dbOpenTable)

rst.MoveFirst
strTemp1 = rst!DONOR_CONTACT_ID
rst.MoveNext
strTemp2 = rst!DONOR_CONTACT_ID

Do While Not (rst!DONOR_CONTACT_ID = rst.EOF)

If strTemp1 = strTemp2 Then
MsgBox ("Equal")

Else
MsgBox ("Not equal")

End If

strTemp1 = strTemp2
rst.MoveNext
strTemp2 = rst!DONOR_CONTACT_ID

Loop

Set dbs = Nothing

End Function

我认为问题在于以下几行:

rst.MoveNext

strTemp2 = rst!DONOR_CONTACT_ID

我认为当没有更多记录时,它正试图进入下一个记录。我的逻辑可能有问题。但我已经盯着它看了一段时间,我的改变没有奏效。我需要另一组眼睛来看一看。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

考虑当你的记录集循环在最后一行时会发生什么,然后你这样做......

rst.MoveNext
strTemp2 = rst!DONOR_CONTACT_ID

MoveNext将记录集置于EOF ---没有记录“当前”。因此,在下一行中,代码会尝试将值从当前行的DONOR_CONTACT_ID存储到strTemp2。但是,由于您位于EOF,因此“当前”没有记录,因此Access会抱怨“无当前记录”

我认为这个版本会避免这个错误。测试逻辑以确保它也能满足您的需求。

rst.MoveFirst
strTemp1 = rst!DONOR_CONTACT_ID
rst.MoveNext
'strTemp2 = rst!DONOR_CONTACT_ID

'Do While Not rst!DONOR_CONTACT_ID = rst.EOF
Do While Not rst.EOF
    strTemp2 = rst!DONOR_CONTACT_ID
    If strTemp1 = strTemp2 Then
        MsgBox "Equal"
    Else
        MsgBox "Not equal"
    End If
    strTemp1 = strTemp2
    rst.MoveNext
    'strTemp2 = rst!DONOR_CONTACT_ID
Loop

答案 1 :(得分:0)

一般的想法是这样的:

Set rst = dbs.OpenRecordset("T_RECIPIENT_SORT", dbOpenDynaset)

Do Until rst.EOF
  'do or check what you want 
  '....
  rst.MoveNext
Loop
rst.Close