帳票フォームでデータの更新などを行ってフォームの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を使って復元しています。
スポンサーリンク