#664 オリジナルのレコード移動ボタンを作るには? フォーム、VBA

オリジナルのレコード移動ボタンは、「コントロール ウィザード」を使ってコマンドボタンをフォームに挿入しようとすれば、ウィザードの画面で選択していくだけで簡単に作れてしまいます。



ここではそれにアレンジを加えて、先頭や前・次などすべてのレコード移動に関する処理をひとつのプロシージャにまとめるとともに、フォームのレコード移動ボタンと同様に、テキストボックスに現在のレコード番号を表示したりその変更でそこにジャンプする機能も付加してみます。

また、そのプロシージャ名を直接プロパティシートに記述できるようFunctionプロシージャとするとともに、標準モジュールに記述します。そうすることで、フォームによって若干のプロパティ変更は必要となるものの、コントロールのコピー&ペーストで比較的容易に他のフォームにもそのボタン機能を流用できるようになります。


そのボタンやプロシージャは次のような手順で作成します。

  1. まず、標準モジュールに次のコードを記述します。

    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


  2. 次に、フォームを作成し、レコード移動用の各コマンドボタン、レコード番号を表示・変更するためのテキストボックスを配置します。

    ※「frm商品マスタ_sub」という名前のサブフォームにデータを表として表示するものとします。
    ※レコード番号用のテキストボックスの名前は「レコード番号」とします。
    ※今回の範疇では、コマンドボタンの名前は何でもかまいません。

  3. プロパティシートにおいて、フォームの各コントロールの当該イベント欄に下記のような式を書き込みます。
    コントロール イベントのプロパティ名 設定する式
    先頭へ移動するコマンドボタン クリック時 =GoToRecordEx(2,Null,"frm商品マスタ_sub")
    前へ移動するコマンドボタン クリック時 =GoToRecordEx(0,Null,"frm商品マスタ_sub")
    次へ移動するコマンドボタン クリック時 =GoToRecordEx(1,Null,"frm商品マスタ_sub")
    最後へ移動するコマンドボタン クリック時 =GoToRecordEx(3,Null,"frm商品マスタ_sub")
    レコード番号用のテキストボックス 更新後処理 =GoToRecordEx(Null,[レコード番号],"frm商品マスタ_sub")



  4. 上記の設定によって、ボタンでのレコード移動、それに伴うレコード番号の表示更新などはできるようになるのですが、サブフォーム内のカーソルやキー操作などによってカレントレコードが移動したとき、このままではそれが反映されません。
    そこで、それらの操作も含めてレコード移動を検出できる「Current/レコード移動時」イベントプロシージャにそのためのコードを追記します。記述先はサブフォームの方のモジュールです。

    Private Sub Form_Current()
    'フォームのレコード移動時

      'メインフォームのレコード番号表示を更新
      Parent!レコード番号 = CStr(Me.CurrentRecord) & "/" & CStr(Me.Recordset.RecordCount)

    End Sub


実行例:
  1. 初期状態


  2. 次レコードへ移動するボタンをクリックしたとき


  3. 最終レコードへ移動するボタンをクリックしたとき


  4. テキストボックスに「3」と入力してEnterキーを押したとき




  5. 先頭レコードへ移動するボタンをクリックしたとき


補足:
上記の例ではサブフォーム内のレコード移動を行っていますが、メインフォーム側(もしくはメイン/サブ形式ではないフォーム)のレコード移動を行いたい場合は、下記のように各プロパティ値を設定します。対象サブフォームがないので、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


| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved