ACCESSでRequeryを行っても一覧の状態が変わらないようにするには?(2)

ADPでは、MDBと異なりサブフォーム・コントロール名に対しRequeryを実行すると、なぜか復元できないようです。
ADPのバグなのか、仕様なのか定かではありませんが….
しかも、Bookmarkでの復元も、ADPでは正確に元の状態に戻らないようです。
その為、別も方法で復元する方法を考えてみました。

本来ならば、表示されている先頭レコード番号が取得できれば良いのですが残念ながら提供されていません。
詳細セクションの高さ、選択レコードの高さから表示されている先頭レコード番号を求めます。

◆サンプルソース

Dim Top, Top1, Top2 As Long
Dim TopRecNo As Long

Me.Painting = False    '画面描画をOFFにする

Me![埋め込み1].SetFocus

'現在選択しているレコード番号を保存
CurrentRecNo = Me![埋め込み1].Form.CurrentRecord
'現在選択しているレコードの高さ保存
Top = Me![埋め込み1].Form.CurrentSectionTop

'1レコードを移動させてそれぞれの高さを保存
If Me![埋め込み1].Form.CurrentRecord = 1 Then
 Top1 = Me![埋め込み1].Form.CurrentSectionTop
 DoCmd.GoToRecord acActiveDataObject, , acNext
 Top2 = Me![埋め込み1].Form.CurrentSectionTop
Else
 DoCmd.GoToRecord acActiveDataObject, , acPrevious
 Top1 = Me![埋め込み1].Form.CurrentSectionTop
 DoCmd.GoToRecord acActiveDataObject, , acNext
 Top2 = Me![埋め込み1].Form.CurrentSectionTop
End If

'表示されている先頭のレコード番号を求める
TopRecNo = CurrentRecNo - Int(Top / (Top2 - Top1))

'整数化することによる誤差を補正する
If TopRecNo < 1 Then
  TopRecNo = 1
End If

'再クエリー実行
Me![埋め込み1].Requery

'表示位置を復元します。
DoCmd.GoToRecord acActiveDataObject, , acLast
DoCmd.GoToRecord acActiveDataObject, , acGoTo, TopRecNo
DoCmd.GoToRecord acActiveDataObject, , acGoTo, CurrentRecNo

◆サンプルDB  Download

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です