終了時サブフォームのレコード位置を保存、再表示時元の位置へ移動する:Access

フォームを閉じた後、再表示させた時、終了時のレコード位置を表示させたい場合があります。ここではサブフォームのレコード位置をフォームが閉じる時に保存し、開く時にサブフォームの同じレコード位置へ移動し、表示させるVBAを作成します。

現在のレコード位置を取得するには、AbsolutePositionを使用します。

サブフォームのレコードセットは,Me!サブフォーム名.Form.Recordsetになります。

指定したレコード位置に移動するには、MoveFirstで先頭レコードに移動した後,Move レコード数を実行します。

BackHome Backテクニック


サブフォームを作成する

リボンの[作成]~フォームグループの[フォーム ウィザード]をクリックします。
フォームグループの[フォーム ウィザード]をクリック

フォーム ウィザードが開くので、表示するフィールドを選択します。
表示するフィールドを選択する

ここではレコード位置が分かり易いように、データシートを選択しました。
データシートを選択する

サブフォームに名前を付けて作成完了です。
サブフォームに名前を付けて作成完了

サブフォームを挿入する親フォームの作成

リボンの[作成]~フォームグループの[フォーム デザイン]をクリックします。
フォームグループの[フォーム デザイン]をクリック

リボンの[フォーム デザイン ツール]~[デザイン]~コントロールグループの[サブフォーム/サブレポート]を選択します。
コントロールグループの[サブフォーム/サブレポート]を選択

フォーム上でドラッグし配置します。
するとサブフォーム ウィザードが表示されるので、最初に作成したサブフォームを指定します。
最初に作成したサブフォームを指定する

フォームに名前を付けて、親フォームの作成完了です。
親フォームの作成完了

フォームビューを実行すると、下のようになります。
フォームビューを実行


標準モジュールにPublic変数を作成する

標準モジュールにPublic変数を作成することで、データベース全体でその変数を使用することができ、フォームが閉じても変数に格納した値は保存されています。

リボン[データベースツール]~マクログループの[Visual Basic]をクリックします。
マクログループの[Visual Basic]をクリック

VBE画面が開きます。
メニューの[挿入]~[標準モジュール]をクリックします。.
[標準モジュール]をクリック

標準モジュールに変数を作成するVBA
標準モジュールに変数を作成するVBA

・Long型の変数lNowrecを宣言します。

Public lNowrec As Long

フォームを閉じる前に、現在のレコード位置を取得する

親フォームのプロパティ「読み込み解除時」で[イベントプロシージャ]を選択し、[…]ボタンをクリックします。
親フォームの「読み込み解除時」で[イベントプロシージャ]

Form_Unloadイベントでレコード位置を取得するVBA
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
サブフォームの指定したレコード位置に移動する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のテスト

通常のアプリケーションの場合では、メニューからフォームを開き、フォームを閉じ、再度メニューから同じフォームを開いた動作と同じになります。

フォームビューを表示し、サブフォームで適当なレコード位置へ移動します。
サブフォームで適当なレコード位置へ移動する

一旦フォームを終了し、デザインビューにしました。
一旦フォームを終了する

フォームを再度実行すると、終了時のレコード位置が表示できました。
終了時のレコード位置が表示できた


BackHome Backテクニック

Copyright(C) FeedSoft