空入力のレコードがたくさんできてしまって困っています。絶対に入力してほしいフィールド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)でもやってみましたがだめでした。
よろしくお願いいたします。
LostFocusではイベントをキャンセルできませんので、Exitイベントを使ってください。
自動生成されるイベントプロシージャの引数に
Cancel As Integer
がある場合はCancel = True
でイベントのキャンセルが可能です。LostFocusのイベントプロシージャは引数がないのでキャンセルはできません。ありがとうございます。できました。
もうひとつご相談です。対象のフォームが分割フォームで作成されているのですが、新規レコードのフィールドAに入力しないまま、データシートビューで別のレコードをクリックすると、フォーカスは教えて頂いたVBAでそこから移動しないのですが、単票フォームはクリックしたレコードに移ってしまいます。それも抑止する方法はないでしょうか?
何度もすみません。
Exitイベントでの入力チェックは完全ではありません。
例えば、先頭のテキストボックスから順に移動しながら入力してくれればいいですが、マウスで別のテキストボックスをクリックして、そのテキストボックスをとばした場合はチェックができません。
分割フォームでもフォーカス移動関係は複雑になるので、うまくいかないこともあるでしょう。
入力チェックを確実にするならやはりテーブルの方で設定するのがいいと思います。
エラーメッセージを希望のものにしたいなら、
テーブルやフィールドの「入力規則」プロパティと「エラーメッセージ」プロパティを使って入力チェックするといいでしょう。
入力必須にしたいフィールドがテキスト型なら、
そのフィールドプロパティを下記のように設定します。
以上でテーブルレベルで入力必須にできます。
>> 3
凄いです。正直、使い道がないプロパティと思っていました。
ありがとうございます。
まだまだ勉強中の私にはハードルが高そうすが、チャレンジしてみます。
いつもありがとうございます。本当に勉強になります。
テーブルでのプロパティ設定のみですので、VBAでコード書くよりよほどハードルは低いと思いますので、とりあえずチャレンジしてみてください。
いつもありがとうございます。できました!
丁寧にご説明頂き助かります!
お世話になっております。上述のExitイベントで未入力に加えて、入力規則にのっとっているか判別(桁数のチェック)を行えるようにしました。
正しく動いているんですが、不正な状態のままレコードを削除したく、困っています。
フォーム上に削除ボタンを作り、 DoCmd.RunCommand acCmdDeleteRecord で削除していますが、不正な入力状態のまま削除ボタンを押すと、先に上述のEXITイベントが発動して、削除ボタンを受け付けてくれません。
回避方法を模索しているんですが、どうしてよいかわかりません。特定のイベントの時だけこのEXITイベントをキャンセルする、というようなテクニックはないでしょうか?