Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Access 2007 VBA:如何获取/更改当前记录&x27;s在屏幕上的位置_Vba_Ms Access_Ms Access 2007 - Fatal编程技术网

Access 2007 VBA:如何获取/更改当前记录&x27;s在屏幕上的位置

Access 2007 VBA:如何获取/更改当前记录&x27;s在屏幕上的位置,vba,ms-access,ms-access-2007,Vba,Ms Access,Ms Access 2007,我有一个显示40行的Access 2007表单。当我打开它时,我希望当前记录的行显示在显示的40行中的第5行位置。换句话说,当前行上方应该有4行,下方应该有35行 MoveUpDown是我执行此操作的第一个剪切,但目前它仅在当前记录的行(由FindFirst移动到)最初显示在行位置#1到#5时才起作用。如何查找当前行相对于显示行的显示位置,以及如何更改它?谢谢 Private Sub OpenMyFormTo(sqlWhere As String) Dim rs As DAO.Recor

我有一个显示40行的Access 2007表单。当我打开它时,我希望当前记录的行显示在显示的40行中的第5行位置。换句话说,当前行上方应该有4行,下方应该有35行

MoveUpDown是我执行此操作的第一个剪切,但目前它仅在当前记录的行(由FindFirst移动到)最初显示在行位置#1到#5时才起作用。如何查找当前行相对于显示行的显示位置,以及如何更改它?谢谢

Private Sub OpenMyFormTo(sqlWhere As String)
    Dim rs As DAO.Recordset, frm As Form
    DoCmd.Openform "myForm", acNormal
    Set frm = Forms("myForm").Form
    Set rs = frm.RecordsetClone
    If Not (rs.BOF And rs.EOF) Then
        rs.MoveFirst
        rs.FindFirst sqlWhere
        frm.Bookmark = rs.Bookmark
        MoveUpDown frm.Recordset, 5
    End If
End Sub

Private Sub MoveUpDown(rs As DAO.Recordset, RowsToMove As Integer)
    Dim RowsActuallyMoved As Integer, i As Integer
    RowsActuallyMoved = 0
    For i = 1 To RowsToMove
        If Not rs.BOF Then
            rs.MovePrevious
            RowsActuallyMoved = RowsActuallyMoved + 1
        End If
    Next i
    For i = 1 To RowsActuallyMoved
        If Not rs.EOF Then rs.MoveNext
    Next i
End Sub

我不完全确定这是否是您所需要的全部:
a) 要直接转到第5条记录,请使用:
DoCmd.GoToRecord acDataForm,Me.Name,acGoTo,5

(仅当代码位于表单自己的代码模块中时,才使用Me.Name)
b) 您可以通过以下方式查询当前职位:
Me.Recordset.AbsolutePosition


奇怪的是,.AbsolutePosition从0开始计数,goto命令从1开始计数。

我相信我有一个答案,尽管我觉得它很笨拙。此过程查找目标行,向下滚动直到目标行不可见,向上滚动到目标行,将目标超调(偏移)其他行,然后向下滚动到目标行。结果是目标行显示为第(偏移+1)个可见行。如果行数<偏移量,则显示为最后一行

Private Sub DisplayWithOffset(frm As Form, sqlWhere as String, Offset As Integer)

    Dim rs As DAO.Recordset, DetailsHt As Long, RowHt As Long, i As Integer
    Dim RowsVisible As Integer, BookmarkAP As Integer, RowsMoved As Integer

    DetailsHt = frm.InsideHeight _
              - frm.Section(acHeader).Height - frm.Section(acFooter).Height
    RowHt = frm.Section(acDetail).Height
    RowsVisible = IIf(RowHt > 0, DetailsHt Mod RowHt, 0)
    Set rs = frm.Recordset

    If Not (rs.BOF And rs.EOF) Then

        rs.MoveLast
        rs.FindFirst sqlWhere

        BookmarkAP = rs.AbsolutePosition

        RowsMoved = 0
        For i = 1 To RowsVisible
            If rs.AbsolutePosition + 1 < rs.RecordCount Then
                rs.MoveNext
                RowsMoved = RowsMoved + 1
            End If
        Next i

        Do Until rs.AbsolutePosition = BookmarkAP
            rs.MovePrevious
        Loop

        RowsMoved = 0
        For i = 1 To Offset
            If rs.AbsolutePosition > 0 Then
                rs.MovePrevious
                RowsMoved = RowsMoved + 1
            End If
        Next i

        For i = 1 To RowsMoved
            rs.MoveNext
        Next i

    End If

End Sub
Private Sub DisplayWithOffset(frm作为表单,sqlWhere作为字符串,Offset作为整数)
Dim rs作为DAO.Recordset,DetailsHt作为Long,RowHt作为Long,i作为Integer
Dim RowsVisible As Integer、BookmarkAP As Integer、RowsMoved As Integer
DetailsHt=frm.内部高度_
-第一节(acHeader).高度-第一节(acFooter).高度
RowHt=首件截面(acDetail).高度
RowsVisible=IIf(RowHt>0,DetailsHt Mod RowHt,0)
设置rs=frm.记录集
如果不是(rs.BOF和rs.EOF),则
莫夫拉斯特
rs.FindFirst sqlWhere
BookmarkAP=rs.AbsolutePosition
RowsMoved=0
对于i=1到行可见
如果rs.AbsolutePosition+10,则
卢布
RowsMoved=RowsMoved+1
如果结束
接下来我
对于i=1到RowsMoved
下一个
接下来我
如果结束
端接头

谢谢,但这不是我要问的
AbsolutePosition
提供当前记录在记录集中的位置,但我想知道的是当前记录在屏幕上显示的行中的行位置。如果我有一个10行高的表单,那么我可能会显示具有
AbsolutePosition
值4、5、6、7、8、9、10、11、12和13的记录。在这种情况下,我想知道
AbsolutePosition=4
的记录在第1行,
AbsolutePosition=5
在第2行,等等。我知道,您需要连续表单的显示索引或滚动条位置,以及当前偏移量。我想说,任何标准方法都无法实现这一点。在类似问题中也没有答案: