こんにちは。お世話になります。
Windows10のAccess2013に関する質問です。
acFormAddで開いたフォーム内のテキストボックス「Text1(仮称)」(データ型:数値型,フィールドサイズ:十進型,値要求:はい,空文字の許可:いいえ,インデックス:いいえ)に値を入力後、フォーカスを取得したままDelete等で入力値を削除すると、値を入力しない限り別のコントロールにフォーカスを移すことができなくなります。
せめてキャンセルボタンは押せるようにしたいので、更新前処理として以下の2種を試してみたのですが、エラーメッセージ「値がフィールドまたはレコードの入力規則に違反しています。」が出てしまいます。
Private Sub Text1_BeforeUpdate(Cancel As Integer)
If IsNull(Text1) = True Then
MsgBox "Text1を入力してください。"
Cancel = True
Me.Text1.Undo
End If
End Sub
Private Sub Text_BeforeUpdate(Cancel As Integer)
If IsNull(Text1) = True Then
MsgBox "Text1を入力してください。"
Cancel = True
Me.Undo
Me.Text2.SetFocus
End If
End Sub
エラーメッセージに対し「OK」を押せばフォーカスを移せるようになりますが、できればエラーメッセージ自体が表示されないようにしたいです。
エラーメッセージの回避策があればご教示ください。よろしくお願いします。
入力必須違反エラーは、フォームのエラー時イベントで拾えます。
Form.Error イベント (Access) | Microsoft Docs
早速のご回答、ありがとうございます。
私が記述したBeforeUpdate部をコメント化し、教えていただいたForm.Errorの記述を追加しましたが、それでも「値がフィールドまたはレコードの入力規則に違反しています。」のエラーが出てしまいました。
フォームのデザインビューで、フォームプロパティの「エラー時」が
[イベント プロシージャ]
となってますか。また、そこのビルドボタンをクリックすると、前回の回答のコードが表示されますか。
はい。フォームプロパティの「エラー時」を[イベント プロシージャ]に変更し、ビルドボタンをクリックしてコードを記述しましたので。
エラーコード3314にあたる、「フィールドに値を入力してください。」という1つ目のメッセージは抑止できているようです。
既定のエラーメッセージの抑制はできているということですね。
私のコードの動作想定は、
ですが、どれが実行されてないですか。
1.から3.までは挙動を確認できています
4.については、フォーカスがText1から動いていないので、動作していないように見受けられますが、処理が停止しているわけではないようです。
試しに全ての行間および最終行にMsgBoxを挿入してみましたが、すべて表示されます。
「値がフィールドまたは……」のメッセージが表示されるのは、全ての処理が完了した後のようです。
当方で作成したサンプルでは、次のコントロールへ移動も問題なくできていますが、SendKeysは環境によっては不安定な場合もあるようです。
次のコントロールへの移動は必須でしょうか。
入力必須のメッセージが出てあと、EnterキーかTabキーで移動できます。
削除したということはユーザーとしては変更の意思があるということなので、それを無視して次のコントロールへ勝手に移動するのは、ユーザーインターフェイスとしてどうかなと思いますが、どうでしょう。
訂正
「値を入力しない限り別のコントロールにフォーカスを移すことができなくなります。」と記載の通り、コントロールを移動できなくなるために困っています。必ずしも次のコントロールへ移動することを求めているわけではありません。
試しにSendKeysの行をコメント化してみましたが、「値がフィールドまたは……」のメッセージは変わらず表示されます。
もう、一度確認しますが、
上記について、間違いないですか。
だとしたら、3. の時点で Undo されますので、削除する前の値が表示されているはずです。
その場合、EnterキーまたはTabキーで次のコントロールへ移動できるはずです。
「3. の時点で Undo されますので、削除する前の値が表示されているはずです。」とのことですが、acFormAdd(=レコードの追加)ですので、値はNullに戻ります。
①Nullのテキストボックス「Text1」をクリック
②「1」キーを押下
③「BackSpace」キーを押下
④「Tab」キーを押下
⑤1.~3.(4.)
この時点でテキストボックスはNullに
⑥「値がフィールドまたは……」
上記のような流れです。
説明が下手で申し訳ありません。
数値型フィールドで値要求を「はい」に設定するなら、規定値を設定しましょう。
フィールドを追加してときは規定値は0に設定されています。
連日ありがとうございます。
規定値を設定すれば、確かに解決しますね。最終手段として押さえておきます。
こちらの意図として、「0」など不適当な値で更新できては困るフィールドであるため、Null(①前の状態)に戻せれば最良と考えています。
その際のエラーメッセージを抑制したいので、そのための手立てがあればご教示願いたいです。
そのテキストボックスのタブオーダーが最後になってませんか。
最後だと、Enterキーでレコード保存してから次のレコードへ移動しようとしますが、Nullのままでは保存できないので、
MsgBox "入力必須なので空欄にはできません"
のメッセージが出て移動できません。コマンドボタン(例えばキャンセルボタン)のタブオーダーを最後にすれば、そのボタンにフォーカス移動します。(当方のサンプルで確認済み。)
テーブルで値要求を「はい」にしておけば、入力必須としては完璧ですが、システムの仕様に依存するので、仕様を変更してユーザーインターフェイスを工夫しようとしてもどうしても制限があります。
下記で入力必須項目があるフォームのUIについて考察していますので、参考にしてみてください。
お返事が遅くなりまして、申し訳ございません。検証に取りかかるまで、大分かかってしまいました。
まず、タブオーダーを確認しましたが最後ではありませんでした。
2つめのメッセージを非表示とする手立ては見つかりませんでしたので、結局規定値を設定する形で対応することとしました。
長らくご検討くださり、ありがとうございました。