2017年10月23日

【Access】帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする


帳票フォームでデータの更新などを行ってフォームのRequeryを実行するとレコードの表示が変わってしまうことがあります。そうするとシステムとしては非常に使いにくいものになってしまいます。

Accessではレコードの表示位置を覚えているわけではないのでこれは仕方ないことなのですが、ちょっとしたテクニックでこの表示位置を維持することが出来ます。

たとえばこのような帳票フォームがあるとします。



このフォームの「再表示」ボタン(buttonRequery)をクリックしてもレコード位置が変わらないようにするためには、クリックイベントプロシージャに次のように記述します。

Private Sub buttonRequery_Click()

    Dim headerHeight As Long
    Dim curTop As Long
    Dim curRecNum As Long
    Dim topRecNum As Long
    
    'IDにフォーカスを移す
    Me.ID.SetFocus
    
    'カレントレコードを取得
    curRecNum = Me.CurrentRecord
    
    'フォームヘッダー行数を取得
    headerHeight = Int(Me.Section("フォームヘッダー").Height / Me.Section("詳細").Height)
    
    '現在のセクションの上端からフォームの上端までの距離(twip)を取得
    curTop = Me.CurrentSectionTop
    
    '現在先頭に表示されているレコード番号を取得
    topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight)
    
    '再表示
    Me.Requery

    '表示位置の復元
    DoCmd.GoToRecord acActiveDataObject, , acLast
    DoCmd.GoToRecord acActiveDataObject, , acGoTo, topRecNum
    DoCmd.GoToRecord acActiveDataObject, , acGoTo, curRecNum
    
End Sub

少し解説すると、現在のカレントレコードと、画面に表示されている先頭行を記憶し、Requery後にGoToRecordを使って復元しています。






スポンサーリンク