フォームを閉じた後、再表示させた時、終了時のレコード位置を表示させたい場合があります。ここではサブフォームのレコード位置をフォームが閉じる時に保存し、開く時にサブフォームの同じレコード位置へ移動し、表示させるVBAを作成します。
現在のレコード位置を取得するには、AbsolutePositionを使用します。
サブフォームのレコードセットは,Me!サブフォーム名.Form.Recordsetになります。
指定したレコード位置に移動するには、MoveFirstで先頭レコードに移動した後,Move レコード数を実行します。
サブフォームを作成する
リボンの[作成]~フォームグループの[フォーム ウィザード]をクリックします。
フォーム ウィザードが開くので、表示するフィールドを選択します。
ここではレコード位置が分かり易いように、データシートを選択しました。
サブフォームに名前を付けて作成完了です。
サブフォームを挿入する親フォームの作成
リボンの[作成]~フォームグループの[フォーム デザイン]をクリックします。
リボンの[フォーム デザイン ツール]~[デザイン]~コントロールグループの[サブフォーム/サブレポート]を選択します。
フォーム上でドラッグし配置します。
するとサブフォーム ウィザードが表示されるので、最初に作成したサブフォームを指定します。
フォームに名前を付けて、親フォームの作成完了です。
フォームビューを実行すると、下のようになります。
標準モジュールにPublic変数を作成する
標準モジュールにPublic変数を作成することで、データベース全体でその変数を使用することができ、フォームが閉じても変数に格納した値は保存されています。
リボン[データベースツール]~マクログループの[Visual Basic]をクリックします。
VBE画面が開きます。
メニューの[挿入]~[標準モジュール]をクリックします。.
標準モジュールに変数を作成するVBA
・Long型の変数lNowrecを宣言します。
Public lNowrec As Long
フォームを閉じる前に、現在のレコード位置を取得する
親フォームのプロパティ「読み込み解除時」で[イベントプロシージャ]を選択し、[…]ボタンをクリックします。
Form_Unloadイベントでレコード位置を取得するVBA
・Public変数lNowreに、AbsolutePositionで取得したサブフォームのレコード位置を代入します。
Private Sub Form_Unload(Cancel As Integer)
Dim trs As Object
Set trs = Me!F_都道府県人口Sub.Form.Recordset
lNowrec = trs.AbsolutePosition
End Sub
フォームを開く時に、レコード位置を移動する
親フォームのプロパティ「読み込み時」で[イベントプロシージャ]を選択し、[…]ボタンをクリックします。
サブフォームの指定したレコード位置に移動するVBA
・テーブルからレコードが削除されている可能性があるので、On Error GoToでエラー回避します。
・RecordsetCloneでサブフォームのレコードセットを作成します。
・MoveFirstで先頭レコードへ移動します。
・Moveで終了時のレコード位置へ移動します。
・Bookmarkでレコードセットと同じレコードを表示させます。
Private Sub Form_Load()
Dim trs As Object
On Error GoTo ErrExit
Set trs = Me!F_都道府県人口Sub.Form.RecordsetClone
trs.MoveFirst
trs.Move lNowrec
Me!F_都道府県人口Sub.Form.Bookmark = trs.Bookmark
Exit Sub
ErrExit:
End Sub
作成したVBAのテスト
通常のアプリケーションの場合では、メニューからフォームを開き、フォームを閉じ、再度メニューから同じフォームを開いた動作と同じになります。
フォームビューを表示し、サブフォームで適当なレコード位置へ移動します。
一旦フォームを終了し、デザインビューにしました。
フォームを再度実行すると、終了時のレコード位置が表示できました。