存在记录时MS Access VBA .recordcount返回0,并且debug.print返回值

时间:2018-06-06 12:42:26

标签: vba ms-access access-vba recordset

我有一个包含10条记录和一个短文字段的Access表。我使用.recordcount函数返回此表中的记录数。代码如下:

Dim db as DAO.Database
Dim RS as DAO.Recordset
Dim recCount as Integer
Set db = CurrentDb
Set RS = db.OpenRecordset("Table Name")

RS.MoveFirst
RS.MoveLast
recCount = RS.recordcount

Debug.Print(recCount)

Dim i as Integer
i = 0
RS.MoveFirst
'Option one. Commented out when option two is active and vice verse
Do While i < 10
    Debug.Print(RS(i))
    i = i + 1
Loop

Do While i < 10
    Debug.print(RS![Only Field Name])
    i = i + 1
    RS.MoveNext
Loop

recCount始终打印为0.尝试打印记录集中的记录将仅返回记录集的第一个值,而不返回任何其他值。在读完第一条记录后,程序会抛出错误&#34;项目未在集合中找到。&#34;我不确定可能导致此错误的原因,因为我使用与另一个VBA模块中的另一个表完全相同的方法,这很好。

我在其他地方查看解决方案,我唯一能找到的是在打开后添加RS.moveFirstRS.moveLast,但这不起作用。我认为这是因为打开的记录集实际上并不包含表中的所有记录。

提前致谢。

4 个答案:

答案 0 :(得分:2)

您可以在计算时列出记录:

Set RS = db.OpenRecordset("Table Name")

While Not RS.EOF
    Debug.Print RS![Only Field Name].Value
    i = i + 1
    RS.MoveNext
Loop

Debug.Print i & " records found."

答案 1 :(得分:1)

编辑:

试试这个:

Sub Demo_IterateRecords()
    Const tblName = "YOUR TABLE NAME HERE"
    Dim rs As Recordset

    Set rs = CurrentDb.OpenRecordset(tblName)
    With rs
        .MoveLast
        .MoveFirst

        If MsgBox("Do you want to list all " & .RecordCount & " records?", _
            vbOKCancel, "Confirmation") <> vbOK Then GoTo ExitMySub

        Do While Not .EOF
            Debug.Print .Fields(0), .Fields(1), .Fields(2)
            rs.MoveNext
        Loop

ExitMySub:
        .Close
    End With
    Set rs = Nothing

End Sub

我使用.Fields(_)因为我不确定你的字段被调用了什么,但更好的方式是引用它们,例如:

        Debug.Print !myID, !myEmployeeName, !myEmployeeAddress

原始答案:

试试这个:

RS.MoveLast
RS.MoveFirst
recCount = RS.RecordCount
Debug.Print(recCount)

Access至少知道有多少条记录,直到您至少浏览过一次。

如果您在循环之后检查了RS.RecordCount 的值,那么您将获得一个数字。

  

说明

     

使用Recordcount属性查找Recordset或TableDef对象中已访问的记录数。在访问所有记录之前,RecordCount属性不指示动态集,快照或仅前向类型Recordset对象中包含的记录数。访问完最后一条记录后,RecordCount属性指示Recordset或TableDef对象中未删除记录的总数。要强制访问最后一条记录,请使用Recordset对象上的MoveLast方法。您还可以使用SQL Count函数来确定查询将返回的大致记录数。

     

重要提示

     

使用MoveLast方法填充新打开的Recordset会对性能产生负面影响。 除非您在打开Recordset 时需要准确RecordCount,否则最好等到您使用其他部分代码填充Recordset < / strong>在检查RecordCount属性之前。

Source)功能

另请参阅: MSDN:Recordset.RecordCount Property

答案 2 :(得分:1)

我设法解决了这个问题,但我不知道为什么会这样。我没有使用创建新表并键入十个记录的值,而是使用插入查询将我想要的值从查询中放入表中。使用这个新表,它工作。

答案 3 :(得分:1)

也许你可以在你的子程序中尝试类似的东西:

Dim db As DAO.Database
Dim RS As DAO.Recordset
Dim recCount As Integer
Set db = CurrentDb
Set RS = db.OpenRecordset("Table Name")
If Not (RS.EOF And RS.BOF) Then
RS.MoveFirst
Do Until RS.EOF = True
RS.MoveNext
Loop
MsgBox ("There are:" & " " & RS.RecordCount & " " & "records in the database")
End If
RS.Close
Set RS = Nothing