4

40行を表示するAccess2007フォームがあります。それを開くと、表示されている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
4

2 に答える 2

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
于 2012-10-26T01:39:42.120 に答える
1

これだけで十分かどうかはわかりません:
a) 5 番目のレコードに直接移動するには、次を使用します: DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, 5
(コードがフォーム独自のコード モジュールにある場合は Me.Name のみ)
b) 現在の位置を照会できます。Me.Recordset.AbsolutePosition
奇妙なことに、.AbsolutePosition は 0 でカウントを開始し、goto コマンドは 1 で開始します。

于 2012-10-25T20:23:23.093 に答える