オリジナルのレコード移動ボタンは、「コントロール ウィザード」を使ってコマンドボタンをフォームに挿入しようとすれば、ウィザードの画面で選択していくだけで簡単に作れてしまいます。
ここではそれにアレンジを加えて、先頭や前・次などすべてのレコード移動に関する処理をひとつのプロシージャにまとめるとともに、フォームのレコード移動ボタンと同様に、テキストボックスに現在のレコード番号を表示したりその変更でそこにジャンプする機能も付加してみます。
また、そのプロシージャ名を直接プロパティシートに記述できるようFunctionプロシージャとするとともに、標準モジュールに記述します。そうすることで、フォームによって若干のプロパティ変更は必要となるものの、コントロールのコピー&ペーストで比較的容易に他のフォームにもそのボタン機能を流用できるようになります。
そのボタンやプロシージャは次のような手順で作成します。
- まず、標準モジュールに次のコードを記述します。
Public Function GoToRecordEx(varRecord As Variant, varRecNum As Variant, _
varSubForm As Variant)
'レコード移動を行う共通Functionプロシージャ
On Error GoTo Err_Handler
If Not IsNull(varSubForm) Then
'varSubForm引数が指定されているときは
'事前にサブフォームにフォーカス移動
Screen.ActiveForm(varSubForm).SetFocus
End If
If Not IsNull(varRecord) Then
'varRecord引数が指定されているときはそれに応じてレコード移動
DoCmd.GoToRecord , , varRecord
ElseIf Not IsNull(varRecNum) Then
'varRecNum引数が指定されているときはそのレコード番号へ移動
DoCmd.GoToRecord , , acGoTo, varRecNum
End If
Exit_Here:
Exit Function
Err_Handler:
Select Case Err.Number
Case 2105, 2505
'先頭レコードでさらに前へ移動しようとしたとき、
'varRecNumに無効な番号が指定されたときなどのエラー
Beep
Case Else
Beep
MsgBox "エラー番号:" & Err.Number & vbCrLf & _
"エラー内容:" & Err.Description, _
vbOKOnly + vbCritical
End Select
Resume Exit_Here:
End Function
- 次に、フォームを作成し、レコード移動用の各コマンドボタン、レコード番号を表示・変更するためのテキストボックスを配置します。
- プロパティシートにおいて、フォームの各コントロールの当該イベント欄に下記のような式を書き込みます。
コントロール |
イベントのプロパティ名 |
設定する式 |
先頭へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(2,Null,"frm商品マスタ_sub") |
前へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(0,Null,"frm商品マスタ_sub") |
次へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(1,Null,"frm商品マスタ_sub") |
最後へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(3,Null,"frm商品マスタ_sub") |
レコード番号用のテキストボックス |
更新後処理 |
=GoToRecordEx(Null,[レコード番号],"frm商品マスタ_sub") |
- 上記の設定によって、ボタンでのレコード移動、それに伴うレコード番号の表示更新などはできるようになるのですが、サブフォーム内のカーソルやキー操作などによってカレントレコードが移動したとき、このままではそれが反映されません。
そこで、それらの操作も含めてレコード移動を検出できる「Current/レコード移動時」イベントプロシージャにそのためのコードを追記します。記述先はサブフォームの方のモジュールです。
Private Sub Form_Current()
'フォームのレコード移動時
'メインフォームのレコード番号表示を更新
Parent!レコード番号 = CStr(Me.CurrentRecord) & "/" & CStr(Me.Recordset.RecordCount)
End Sub
実行例:
- 初期状態
- 次レコードへ移動するボタンをクリックしたとき
- 最終レコードへ移動するボタンをクリックしたとき
- テキストボックスに「3」と入力してEnterキーを押したとき
- 先頭レコードへ移動するボタンをクリックしたとき
補足:
上記の例ではサブフォーム内のレコード移動を行っていますが、メインフォーム側(もしくはメイン/サブ形式ではないフォーム)のレコード移動を行いたい場合は、下記のように各プロパティ値を設定します。対象サブフォームがないので、3番目の引数を「Null」にします。
コントロール |
イベントのプロパティ名 |
設定する式 |
先頭へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(2,Null,Null) |
前へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(0,Null,Null) |
次へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(1,Null,Null) |
最後へ移動するコマンドボタン |
クリック時 |
=GoToRecordEx(3,Null,Null) |
レコード番号用のテキストボックス |
更新後処理 |
=GoToRecordEx(Null,[レコード番号],Null) |
またレコード移動時のイベントプロシージャは、下記のコードを”メインフォーム”の方のモジュールに記載します。
Private Sub Form_Current()
'フォームのレコード移動時
'フォームのレコード番号表示を更新
Me!レコード番号 = CStr(Me.CurrentRecord) & "/" & CStr(Me.Recordset.RecordCount)
End Sub
|