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

■1番、簡単な方法

Requeryしたいデータシートを、サブフォームとして作成します。
そして、サブフォーム名ではなく、サブフォームのコントロール名
に対してRequeryを実行すると、な、なんと、カーソル位置が変わりません。
 
で、サブフォームのコントロール名とは、標準で「埋め込み1」などの
名前で作成されるコントロールです。

<サンプル>
  
1)サブフォームからRequery実行

Private Sub Form_AfterUpdate()

 Me.Painting = False  '画面描画をOFFにする
 Me.Parent![埋め込み1].Requery 
 Me.Painting = True   '画面描画をONにする

End Sub

2)親フォームからRequery実行

Private Sub Form_AfterUpdate()

 Me.Painting = False  '画面描画をOFFにする
 Me![埋め込み1].Requery
 Me.Painting = True  '画面描画をONにする

End Sub

補足:サブフォームをウイザードを使って作成すると、サブフォーム・コントロール名はサブフォーム名と同一になります。
    Me![埋め込み1].Requery を  Me![埋め込み1].form.Requery に変更すると、Requeryした時、先頭行にジャンプします。

■一般的な方法

単一のフォームの場合、上記の方法は使えません。 
そこで、行の位置、列の位置をRequery前に保存しておいて、
Requery後に復元する古典的な方法です。

<サンプル>

Private Sub Form_AfterUpdate()

 Dim varBM As Variant '行位置用の変数
 Dim varSF As String  '列位置用の変数

 Me.Painting = False  '画面描画をOFFにする
 varBM = Me.Bookmark  '行位置を保存
 varSF = Me.ActiveControl.Name  '列位置を保存

 Me.Requery   '再クエリー実行

 Me.Bookmark = varBM  '行位置を復元
 Me.Controls(varSF).SetFocus  '列位置を復元する
 Me.Painting = True  '画面描画をONにする

End Sub

◆サンプルDB  Download

コメントを残す

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