#396 帳票形式サブフォームからメインフォームへの自動フォーカス移動 フォーム、VBA

帳票形式のサブフォームを持ったメイン/サブフォームにおいては、サブフォーム側にいったんフォーカスが移動すると、マウス操作などを行わなければメインフォーム側にフォーカスを戻すことができません。フォーカス移動用のキーであるTabキーやEnterキーで自動的にメインフォームにフォーカスが戻ることはありません。ここでは、そのような動作の制限をVBAで変更し、サブフォームからメインフォームへのフォーカス移動を実現する方法を紹介します。

※ただしサブフォームが"データシートビュー"で表示されているときは、サブフォームの最終レコードの最後のコントロールでTabキーなどを押すことによってフォーカスがメインフォームに戻ります(このときメイン側の「Tabキー移動」プロパティの設定によっては次レコードへの移動も起こります)。したがってその場合には、このような特別なことを行う必要はありません。


ここではまず、次のようなメイン/サブフォームでの動きを考えてみます。
メイン/サブフォームのサンプル

フォームを開いた直後、TabキーもしくはEnterキーを押していくと、次のような順でフォーカスが移動します。
  1. メインフォームの「受注コード」→「得意先」→「社員」→「出荷先名」
  2. サブフォームの先頭レコードに移動して、サブフォームの「受注コード」
  3. サブフォームの「商品」→「単価」→「数量」→「割引」
  4. サブフォームの2レコード目に進んで、各コントロールを順番に移動
  5. 以降、最終レコードまで移動
  6. 最下の新規レコードの最後のコントロールである「割引」でTabキーなどを押すと、同じレコードの「受注コード」に移動、以降は、そのレコード以外のレコードに進むことはありません。
通常のフォーカス移動

そこで、『サブフォームのカレントレコードが画面最下の新規レコードである状態で、「割引」のコントロールから次のコントロールに移動しようとしたら、強制的にメインフォーム側にフォーカスを移動させる』という考え方でプログラムを付け加えてみます。

サブフォームの「割引」コントロールからフォーカスが失われたタイミングでアクションを起こせばよいので、次のような"LostFocus/フォーカス喪失後"イベントプロシージャをサブフォームのモジュールに記述します。

Private Sub 割引_LostFocus()
'割引のフォーカス喪失後

  '新規レコードなら処理を実行
  If Me.NewRecord Then
    '再度サブフォームにフォーカスが移動したときに備えて
    'サブフォームの先頭レコードの先頭コントロールにフォーカス移動
    Me.Recordset.MoveFirst
    Me!受注コード.SetFocus

    'メインフォームにフォーカス移動
    Parent!受注コード.SetFocus

  End If

End Sub

このイベントプロシージャを使ってフォームを実行すると、次のような順番でフォーカス移動が行われるようになります。
変更後のフォーカス移動


なお、サブフォームが新規レコードの追加ができないようなデザインになっている場合、あるいは既存の最後のレコードからメインフォームにフォーカスを戻したい場合には、カレントレコードが新規レコードではなく既存の最後のレコードであるときに同様のアクションを起 こす必要があります。そのような場合には、次のようなコードで"最終レコードである"ことを検出します。

Private Sub 割引_LostFocus()
'割引のフォーカス喪失後

  '最後のレコードなら処理を実行
  If Me.CurrentRecord = Me.Recordset.RecordCount Then
    Me.Recordset.MoveFirst
    Me!受注コード.SetFocus
    Parent!受注コード.SetFocus
  End If

End Sub

| Index | Prev | Next |



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