Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问:移动到下一个记录,直到EOF_Ms Access_Vba - Fatal编程技术网

Ms access 访问:移动到下一个记录,直到EOF

Ms access 访问:移动到下一个记录,直到EOF,ms-access,vba,Ms Access,Vba,我需要通过移动到记录集中的下一条记录来循环浏览表单 我正在使用Form_Current事件循环通过。 我用了两种说法,得出了不同的结果 这一条有时会崩溃,并给出错误消息:“您无法转到指定的记录。” 这一次最多只能记录72条记录并停止 DoCmd.RunCommand acCmdRecordsGoToNext Me.Recordset.MoveNext 这一次最多只能记录129条记录并停止 DoCmd.RunCommand acCmdRecordsGoToNext Me.Recordset.

我需要通过移动到记录集中的下一条记录来循环浏览表单

我正在使用Form_Current事件循环通过。 我用了两种说法,得出了不同的结果

这一条有时会崩溃,并给出错误消息:“您无法转到指定的记录。”

这一次最多只能记录72条记录并停止

DoCmd.RunCommand acCmdRecordsGoToNext
Me.Recordset.MoveNext
这一次最多只能记录129条记录并停止

DoCmd.RunCommand acCmdRecordsGoToNext
Me.Recordset.MoveNext
试图找到一条指令,该指令将转到下一条记录,直到到达文件末尾。 我使用Access 2010(Access 2002-2003文件格式mdb)作为前端。记录源是一个SQL Server 2008链接视图

If (Not IsNull(Me.id.Value)) Then
DoCmd.GoToRecord , , acNext
End If
嗨, 你需要把它放在激活表单中,并有一个名为id的id字段


通过这种方式,它会一直传递,直到到达一个没有id的记录(也称为新记录).

以从当前记录循环到结束:

While Me.CurrentRecord < Me.Recordset.RecordCount
    ' ... do something to current record
    ' ...

    DoCmd.GoToRecord Record:=acNext
Wend
而Me.CurrentRecord
要检查是否可以转到下一个记录:

If Me.CurrentRecord < Me.Recordset.RecordCount Then
    ' ...
End If
如果Me.CurrentRecord
我过去曾经这样做过,并且一直使用:

  With Me.RecordsetClone
    .MoveFirst
    Do Until .EOF
      If Me.Dirty Then
         Me.Dirty = False
      End If
      .MoveNext
      Me.Bookmark = .Bookmark
    Loop
  End With

有些人会使用表单的记录集,这不需要设置书签(即,导航表单的记录集会自动导航表单的编辑缓冲区,因此用户会立即看到移动),但我更喜欢间接地使用记录集克隆。

无论您是添加新记录还是删除,在表单关闭事件中添加此代码,它将重新创建从1到最后一条记录的主键。此代码不会干扰表的其他列

Sub updatePrimaryKeysOnFormClose()
    Dim i, rcount As Integer
    'Declare some object variables
    Dim dbLib As Database
    Dim rsTable1 As Recordset
    'Set dbLib to the current database (i.e. LIBRARY)
    Set dbLib = CurrentDb
    'Open a recordset object for the Table1 table
    Set rsTable1 = dbLib.OpenRecordset("Table1")
    rcount = rsTable1.RecordCount
    '== Add New Record ============================  
        For i = 1 To rcount
              With rsTable1
                      rsTable1.Edit  
                      rsTable1.Fields(0) = i  
                      rsTable1.Update  
                      '-- Go to Next Record ---  
                      rsTable1.MoveNext
             End With  
        Next  
        Set rsTable1 = rsTable1
End Sub

如果希望cmd按钮在表单记录中循环,请尝试将此代码添加到
cmdNext\u单击
cmdPrevious\u单击
VBA。 我发现它运行良好,能够处理BOF/EOF问题:

On Error Resume Next

DoCmd.GoToRecord , , acNext

On Error Goto 0


On Error Resume Next

DoCmd.GoToRecord , , acPrevious

On Error Goto 0

祝你好运!PT

保持代码简单始终是我的建议:

If IsNull(Me.Id) = True Then
  DoCmd.GoToRecord , , acNext
Else
  DoCmd.GoToRecord , , acLast
End If

我在表单上使用ActiveX控件,需要单独处理每条记录。@David:我在那里设置了书签,以便循环从当前记录开始。他最初说他需要遍历记录,这并不意味着要移动表单本身。关于RecordsetClone和表单的编辑/显示缓冲区之间的区别,有一点很好——即RecordsetClone书签独立于表单的记录指针来导航RecordsetClone。您可能希望在不更改显示缓冲区的情况下进行编辑。所以,我删除了我的评论。但是,如果编辑记录需要ActiveX控件,那么这肯定必须在表单的编辑/显示缓冲区中完成,而不仅仅是在RecordsetClone中,因为ActiveX控件只能在表单的编辑缓冲区(即显示的内容)上操作。我喜欢这样。又好又简单。谢谢