Microsoft Access 掲示板

サブフォームのフォーカス移動

8 コメント
views
4 フォロー

ACCESS勉強中のものです。メイン/サブフォームを作成しており解決できないことがでてきましたので質問投稿しました。メインには5ヶ程項目があり必須項目以外は未入力の場合もあり、サブには8ヶ程項目がありこれも必須項目以外は未入力の場合があります。メインには新規レコードボタンを設置しており移動可能にしてます。サブには必須項目を先に入力しないと他の項目には移れない様に下記のコード記述してます。
  If IsNull(F1) Then
        MsgBox ("先にF1を入力して下さい。")
        Me.[F1].SetFocus
        Exit Sub
   End If
新規レコードボタンで移動後メインに入力後サブにフォーカス移動させると上記のメッセージとなることがあり、調べるとレコード移動前にサブの最後に入力した項目部にフォーカスが残っていることが分かりました。新規レコードボタンで移動後は常にサブのF1項目に戻しておきたくてそのボタンコードの DoCmd.GoToRecord , , acNewRec に下記を追記したのですがサブのフォーカスは移動しません。
     Me.Fサブ名.SetFocus
         Me.Fサブ名.Form!F1.SetFocus
どうすれば解決出来るか分からないのです。

ひで
作成: 2024/01/12 (金) 09:56:12
通報 ...
1

サブには必須項目を先に入力しないと他の項目には移れない様に下記のコード記述してます。

このコードをどこのどのイベントに記述してますか。一部を抜粋するのではなく、
Sub から End Sub までをすべてコピペしてもらった方が話かはやいと思います。

どちらにしても入力必須項目をSetFocusで制御しようという仕様は無理があると思いますので、この仕様から考え直した方かいい気がします。

2
ひで 2024/01/12 (金) 11:40:47 ddfe5@3f4b9

hatenaさんありがとうございます。 MsgBox ("先にF1を入力して下さい。")のコードはF1以降の項目のフォーカス取得後(GotFocus)イベントに記述しています。防ぎたいことは例えばメインの項目だけ入力して(サブには未入力)新規レコードボタンで移動することです(他の移動ボタンにもそうですが)。確かに今の方法では都度の対処だけの感じですね。
全体で考えるならどんなアイデアがあるでしょうか? 思いつかないもので。

3
ひで 2024/01/12 (金) 12:40:12 ddfe5@3f4b9

先ほど投稿したのですが、内容間違えてました。メインの項目だけ入力して(サブには未入力)新規レコードボタンで移動することは現状カバー出来てました。失礼しました。
やはりメイン・サブの入力後に新規レコードボタンで移動するとサブの直近に入力した項目にフォーカスが残ったままなので(F2、F3・・・)に留まったままなのでメイン入力後サブに移動すると記述しているメッセージが出るのをなんとかしたいということです。一回毎にフォームを閉じるとこうならないのですが。どう制御するといいか分からないので。

4

前にもいったようにフォーカス系のイベント内でSetFocusで制御しようとすると、今回のような場合も含めて、いろいろ複雑になり制御しきれません。ユーザーも必ず先頭項目から順に入力してくれるとは限りませんし、すべての項目を入力してから必須項目のデータを削除したりとかもありえます。それらも考慮するとますます泥沼になります。

一番確実なのは、入力必須フィールドはテーブルデザインで「値入力」プロパティを「はい」に設定しておくことです。
そうすればそのフィールドが未入力状態ではレコード保存できなくできます。

ユーザーに入力順を強制するというユーザーインターフェイス(UI)が本当に必要でしょうか。
レコード保存する前に、必須項目は入力されているか、入力値に矛盾はないか等をチェックして、問題があるときはメッセージを表示してユーザーに修正を即するというUIのほうが使いやすいし、設計もはるかに楽です。

5

前の回答でふれたように現状の仕様ではいろいろ不具合が出てくると思いますが、
とりあえずレコード移動したときに、常に[F1]にフォーカスを移動させておきたいのなら、
サブフォームのレコード移動時のイベントプロシージャを下記のように設定したらどうでしょう。

Private Sub Form_Current()
    Me.F1.SetFocus
End Sub

あるいは、F1フィールドが未入力の場合のみ移動させるなら、

Private Sub Form_Current()
     If IsNull(Me.F1.Value) Then Me.F1.SetFocus
End Sub
6
ひで 2024/01/15 (月) 08:24:08 ddfe5@00814

hatenaさんありがとうございます。確かに「値入力」プロパティを「はい」がシンプルで一番いいですね。要は必須項目が未入力なら保存不可にしたらいいですね。こうしておけば入力順番もそんなに考えなくてもいいですね。出てくる現象に対してだけ対処しても根本が不完全なら意味ないですね。全体を見て作成しなくては上手くいきませんね。
まだまだ勉強が必要よ痛感しました。大変参考になりました。

7

入力チェックはテーブルで設定しておくのが確実ですね。下記もご参考に。

テーブルでの入力チェック、入力規制 - hatena chips

ただ、これだけだとシステムの出すメッセージは不親切だし、未入力項目にフォーカス移動させるなど細かい制御ができないので、それがしたいときはVBAを使うことになります。その場合は下記などもご参考に。

複数項目の入力チェックを共通モジュール化する - hatena chips

8
ひで 2024/01/17 (水) 12:20:21 ddfe5@00814

hatenaさんありがとうございます。”テーブルで可能なことは、テーブルで行う” は確かにその通りですね。今回の件以外で、ついついクエリ時の関数で複雑な分岐をしがちなので大変参考になりました。