Microsoft Access 掲示板

値要求テキストボックスのエラー回避

21 コメント
views
4 フォロー

こんにちは。お世話になります。
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」を押せばフォーカスを移せるようになりますが、できればエラーメッセージ自体が表示されないようにしたいです。

エラーメッセージの回避策があればご教示ください。よろしくお願いします。

大坊頭
作成: 2022/09/14 (水) 20:39:10
通報 ...
1

入力必須違反エラーは、フォームのエラー時イベントで拾えます。

Form.Error イベント (Access) | Microsoft Docs

Private Sub Form_Error(DataErr As Integer, Response As Integer)
    If DataErr = 3314 Then
        Response = acDataErrContinue '既定のエラーメッセージを表示しない
        MsgBox "入力必須なので空欄にはできません"
        Me.ActiveControl.Undo
        SendKeys "{TAB}" '次のコントロールへ移動
    End If
End Sub
2
大坊頭 2022/09/15 (木) 13:49:20 e4b95@e5a6d >> 1

早速のご回答、ありがとうございます。
私が記述したBeforeUpdate部をコメント化し、教えていただいたForm.Errorの記述を追加しましたが、それでも「値がフィールドまたはレコードの入力規則に違反しています。」のエラーが出てしまいました。

3

フォームのデザインビューで、フォームプロパティの「エラー時」が [イベント プロシージャ] となってますか。
また、そこのビルドボタンをクリックすると、前回の回答のコードが表示されますか。

画像1

4
大坊頭 2022/09/15 (木) 20:40:45 e4b95@e5a6d >> 3

はい。フォームプロパティの「エラー時」を[イベント プロシージャ]に変更し、ビルドボタンをクリックしてコードを記述しましたので。

5
大坊頭 2022/09/15 (木) 21:10:23 e4b95@e5a6d >> 4

エラーコード3314にあたる、「フィールドに値を入力してください。」という1つ目のメッセージは抑止できているようです。

6

既定のエラーメッセージの抑制はできているということですね。

私のコードの動作想定は、

  1. 既存のメッセージを抑制。
  2. 代わりに、"入力必須なので空欄にはできません"とメッセージを表示。
  3. Undoで削除を取り消して元に戻す
  4. 次のコントロールへ移動

ですが、どれが実行されてないですか。

7
大坊頭 2022/09/16 (金) 14:39:18 ef5e5@9454b >> 4

1.から3.までは挙動を確認できています
4.については、フォーカスがText1から動いていないので、動作していないように見受けられますが、処理が停止しているわけではないようです。
試しに全ての行間および最終行にMsgBoxを挿入してみましたが、すべて表示されます。
「値がフィールドまたは……」のメッセージが表示されるのは、全ての処理が完了した後のようです。

8

当方で作成したサンプルでは、次のコントロールへ移動も問題なくできていますが、SendKeysは環境によっては不安定な場合もあるようです。

次のコントロールへの移動は必須でしょうか。

入力必須のメッセージが出てあと、EnterキーかTabキーで移動できます。
削除したということはユーザーとしては変更の意思があるということなので、それを無視して次のコントロールへ勝手に移動するのは、ユーザーインターフェイスとしてどうかなと思いますが、どうでしょう。

9
大坊頭 2022/09/16 (金) 17:26:12 e4b95@62c21 >> 8

値を入力しない限り別のコントロールにフォーカスを移すことができなくなります。
コントロールを移動できなくなるために困っています。必ずしも次のコントロールへ移動することを求めているわけではありません。

10
大坊頭 2022/09/16 (金) 17:28:48 e4b95@62c21 >> 9

訂正
「値を入力しない限り別のコントロールにフォーカスを移すことができなくなります。」と記載の通り、コントロールを移動できなくなるために困っています。必ずしも次のコントロールへ移動することを求めているわけではありません。

11
大坊頭 2022/09/16 (金) 17:29:25 e4b95@62c21 >> 9

試しにSendKeysの行をコメント化してみましたが、「値がフィールドまたは……」のメッセージは変わらず表示されます。

12

もう、一度確認しますが、

1.から3.までは挙動を確認できています

上記について、間違いないですか。

だとしたら、3. の時点で Undo されますので、削除する前の値が表示されているはずです。
その場合、EnterキーまたはTabキーで次のコントロールへ移動できるはずです。

13
大坊頭 2022/09/16 (金) 22:44:18 e4b95@62c21 >> 12

「3. の時点で Undo されますので、削除する前の値が表示されているはずです。」とのことですが、acFormAdd(=レコードの追加)ですので、値はNullに戻ります。

14
大坊頭 2022/09/16 (金) 22:49:01 e4b95@62c21 >> 13

①Nullのテキストボックス「Text1」をクリック
②「1」キーを押下
③「BackSpace」キーを押下
④「Tab」キーを押下
⑤1.~3.(4.)
この時点でテキストボックスはNullに
⑥「値がフィールドまたは……」

15
大坊頭 2022/09/16 (金) 22:55:41 e4b95@62c21 >> 13

上記のような流れです。
説明が下手で申し訳ありません。

16

数値型フィールドで値要求を「はい」に設定するなら、規定値を設定しましょう。
フィールドを追加してときは規定値は0に設定されています。

17
大坊頭 2022/09/17 (土) 07:17:59 e4b95@dce72 >> 16

連日ありがとうございます。
規定値を設定すれば、確かに解決しますね。最終手段として押さえておきます。

18
大坊頭 2022/09/17 (土) 07:20:16 e4b95@dce72

こちらの意図として、「0」など不適当な値で更新できては困るフィールドであるため、Null(①前の状態)に戻せれば最良と考えています。
その際のエラーメッセージを抑制したいので、そのための手立てがあればご教示願いたいです。

19
hatena 2022/09/17 (土) 10:58:09 修正

そのテキストボックスのタブオーダーが最後になってませんか。
最後だと、Enterキーでレコード保存してから次のレコードへ移動しようとしますが、Nullのままでは保存できないので、
MsgBox "入力必須なので空欄にはできません"のメッセージが出て移動できません。

コマンドボタン(例えばキャンセルボタン)のタブオーダーを最後にすれば、そのボタンにフォーカス移動します。(当方のサンプルで確認済み。)

20

テーブルで値要求を「はい」にしておけば、入力必須としては完璧ですが、システムの仕様に依存するので、仕様を変更してユーザーインターフェイスを工夫しようとしてもどうしても制限があります。

下記で入力必須項目があるフォームのUIについて考察していますので、参考にしてみてください。

入力必須項目のある入力フォームのUIを考察する
Accessでは入力必須のフィールドは、テーブルのデザインで「値要求」を「はい」にするのが一番確実な方法です。今回は、ユーザーとってやさしいインタフェースという観点から入力フォームのデザインを考えてみます。...
Fc2

21
大坊頭 2022/09/26 (月) 17:19:12 e4b95@edbad >> 20

お返事が遅くなりまして、申し訳ございません。検証に取りかかるまで、大分かかってしまいました。
まず、タブオーダーを確認しましたが最後ではありませんでした。
2つめのメッセージを非表示とする手立ては見つかりませんでしたので、結局規定値を設定する形で対応することとしました。
長らくご検討くださり、ありがとうございました。