Microsoft Access 掲示板

入力するまでフォーカスを移動させない方法はないでしょうか?

8 コメント
views
4 フォロー

空入力のレコードがたくさんできてしまって困っています。絶対に入力してほしいフィールドAから、入力が完了するまでフォーカスを移動させない方法がないでしょうか?
テーブルの値要求をはいにしてみましたが、エラー回避がうまくいかないし、メッセージがユーザー目線ではないので使いたくないです。従って新規レコードに移動した際、フィールドAにレコードをセットさせた後、フォーカス喪失後のイベントに以下のコードを書きました。

Private Sub フィールドAテキスト_LostFocus(Cancel As Integer)
'入力チェック
If Me.フィールドAテキスト = "" Or IsNull(Me.フィールドAテキスト) Then
MsgBox "入力して下さいよ"
Me.フィールドAテキスト .SetFocus
Else
End If
End Sub
これで別のテキストボックスをクリックすると、メッセージはでるのですが、フォーカスはそこに移動してしまいます。
回避方法あれば教えてください。

Private Sub フィールドAテキスト_Exit(Cancel As Integer)でもやってみましたがだめでした。

よろしくお願いいたします。

nanana
作成: 2022/02/11 (金) 17:43:20
通報 ...
1

LostFocusではイベントをキャンセルできませんので、Exitイベントを使ってください。

Private Sub フィールドAテキスト_Exit(Cancel As Integer)
    '入力チェック
    If Nz(Me.フィールドAテキスト.Value) = "" Then
        MsgBox "入力して下さいよ"
        Cancel = True 'イベントキャンセル
    End If
End Sub

自動生成されるイベントプロシージャの引数に Cancel As Integer がある場合は Cancel = True でイベントのキャンセルが可能です。LostFocusのイベントプロシージャは引数がないのでキャンセルはできません。

2
nanana 2022/02/14 (月) 10:01:50 e48ae@6eb0c

ありがとうございます。できました。
もうひとつご相談です。対象のフォームが分割フォームで作成されているのですが、新規レコードのフィールドAに入力しないまま、データシートビューで別のレコードをクリックすると、フォーカスは教えて頂いたVBAでそこから移動しないのですが、単票フォームはクリックしたレコードに移ってしまいます。それも抑止する方法はないでしょうか?

何度もすみません。

3
hatena 2022/02/14 (月) 23:09:30 修正

Exitイベントでの入力チェックは完全ではありません。
例えば、先頭のテキストボックスから順に移動しながら入力してくれればいいですが、マウスで別のテキストボックスをクリックして、そのテキストボックスをとばした場合はチェックができません。
分割フォームでもフォーカス移動関係は複雑になるので、うまくいかないこともあるでしょう。

入力チェックを確実にするならやはりテーブルの方で設定するのがいいと思います。
エラーメッセージを希望のものにしたいなら、
テーブルやフィールドの「入力規則」プロパティと「エラーメッセージ」プロパティを使って入力チェックするといいでしょう。

入力必須にしたいフィールドがテキスト型なら、
そのフィールドプロパティを下記のように設定します。

プロパティ設定値
値要求はい
空文字列の許可はい
入力規則<>""
エラーメッセージ入力して下さいよ
 
さらにテーブルプロパティも下記のように設定します。
プロパティ設定値
入力規則[フィールドA]<>""
エラーメッセージフィールドAに入力して下さいよ

以上でテーブルレベルで入力必須にできます。

4
りんご 2022/02/14 (月) 23:41:44 c564b@0e907

>> 3
凄いです。正直、使い道がないプロパティと思っていました。

5
nanana 2022/02/15 (火) 10:12:16 e48ae@6eb0c

ありがとうございます。
まだまだ勉強中の私にはハードルが高そうすが、チャレンジしてみます。
いつもありがとうございます。本当に勉強になります。

6

テーブルでのプロパティ設定のみですので、VBAでコード書くよりよほどハードルは低いと思いますので、とりあえずチャレンジしてみてください。

画像1

7
nanana 2022/02/16 (水) 12:35:51 e48ae@6eb0c

いつもありがとうございます。できました!
丁寧にご説明頂き助かります!

8
nanana 2022/02/18 (金) 13:43:43 e48ae@6eb0c

お世話になっております。上述のExitイベントで未入力に加えて、入力規則にのっとっているか判別(桁数のチェック)を行えるようにしました。
正しく動いているんですが、不正な状態のままレコードを削除したく、困っています。
フォーム上に削除ボタンを作り、    DoCmd.RunCommand acCmdDeleteRecord で削除していますが、不正な入力状態のまま削除ボタンを押すと、先に上述のEXITイベントが発動して、削除ボタンを受け付けてくれません。

回避方法を模索しているんですが、どうしてよいかわかりません。特定のイベントの時だけこのEXITイベントをキャンセルする、というようなテクニックはないでしょうか?