【问题标题】:Access 2007 VBA: how to get / change the current record's position on the screenAccess 2007 VBA:如何获取/更改当前记录在屏幕上的位置
【发布时间】:2016-03-09 10:33:21
【问题描述】:

我有一个显示 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

【问题讨论】:

    标签: vba ms-access ms-access-2007


    【解决方案1】:

    我不完全确定这是否就是您所需要的:
    a) 直接转到第 5 条记录,使用: DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, 5
    (仅当代码在表单自己的代码模块中时才使用 Me.Name)
    b)您可以使用查询当前位置 Me.Recordset.AbsolutePosition
    奇怪的是,.AbsolutePosition 从 0 开始计数,goto 命令从 1 开始计数。

    【讨论】:

    • 谢谢,但这不是我要问的。 AbsolutePosition 给了我当前记录在记录集中的位置,但我想知道的是当前记录在屏幕上显示的行中的行位置。如果我有一个 10 行高的表单,那么我可能会显示 AbsolutePosition 值为 4、5、6、7、8、9、10、11、12 和 13 的记录。在这种情况下,我想知道AbsolutePosition = 4 的记录在第 1 行,AbsolutePosition = 5 在第 2 行,等等。
    • 我明白了,可以说,你需要显示连续表单的索引或滚动条位置,当前的偏移量。我想说这是任何标准方法都无法访问的。这里也没有类似问题的答案:stackoverflow.com/questions/12729786/…
    【解决方案2】:

    我相信我有一个答案,尽管它对我来说似乎很笨拙。此过程找到目标行,向下滚动直到目标行不可见,向上滚动回目标行,超出目标(偏移)额外行,然后向下滚动回目标行。结果是目标行显示为第 (Offset + 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多