Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : 指定なし)
入力漏れの際のエラーメッセージ
投稿日時: 19/05/05 14:54:41
投稿者: hay.hide

以下のように、フォーム上の登録ボタンを押すと
データが保存され、新規レコードの業務名テキストボックスに移動します。
 
この際、業務名テキストボックスが空欄だった場合にエラーメッセージを表示する方法はありますでしょうか?
 
 
Private Sub 登録ボタン_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord acForm, "F_?Α?", acNewRec
業務名.SetFocus
End Sub

投稿日時: 19/05/05 14:55:48
投稿者: hay.hide

[quote="hay.hide"]以下のように、フォーム上の登録ボタンを押すと
データが保存され、新規レコードの業務名テキストボックスに移動します。
 
この際、業務名テキストボックスが空欄だった場合にエラーメッセージを表示する方法はありますでしょうか?
 
 
Private Sub 登録ボタン_Click()
DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord acForm, F_入力, acNewRec
業務名.SetFocus
 
※一部文字化けしていました。
 
 
End Sub[/quote

回答
投稿日時: 19/05/06 14:50:11
投稿者: hatena
投稿者のウェブサイトに移動

連結フォームでの入力チェックは、コマンドボタンクリック時にするのではなく、
フォームの更新前処理でするべきです。
 
フォームを閉じたり、レコードセレクターをクリックしたり、レコード移動、Shift + Enter 等でレコード保存されます。コマンドボタンのクリック時にチェックする場合は、上記でのレコード保存ではチェックをすり抜けてしまいます。
 
 

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsNull(Me.業務名.Value) Then
        Cancel = True '更新イベントを中止する
        MsgBox "業務名を入力してください。"
        Me.業務名.SetFocus
    End if
End Sub

 
これでどのような方法でレコード保存しても入力チェックできます。

投稿日時: 19/05/06 15:38:18
投稿者: hay.hide

ご教授いただいたようにVBAを記述して登録ボタンを押すと
「業務名を入力してください」とエラーメッセージが出ます。
 
メッセージボックスのOKボタンを押すと
@「指定したレコードに移動できません。」
  「レコードセットの最後のレコードよりも後に移動することはできません。」
 
とエラーメッセージが出てしまいます。
 
このメッセージボックスのOKボタンを押すと
Aマクロのシングルステップなるウィンドウが出てきてしまいます。
  エラー番号は「2105」です。
 
ここで「すべてのマクロを停止」ボタンを押すと
業務名にカーソルが置かれ入力できるようになります。
 
登録ボタンにはクリック時に以下のコードを割り当てて
新規レコードに移動するようにしています。
 
DoCmd.GoToRecord acDataForm, "社員名簿", acNewRec
Me.氏名.SetFocus
 
そこで
この2行の前に
On Error Resume Next
を記述すると@Aのエラーは出なくなりました。
 
しかし、これだと
業務名が空白の時に登録ボタンを押すとカーソルは業務名には行かずに
氏名に置かれます。(当たり前ですが。。。)
 
この2つを分岐させる方法はないでしょうか?
 
データ入力漏れがある場合はエラーメッセージを表示してそのテキストボックスにカーソルを置く
 
データ入力漏れがない場合は新規レコードに移動して氏名テキストボックスにカーソルを置く
 
いかがでしょうか?
 

回答
投稿日時: 19/05/07 09:58:50
投稿者: hatena
投稿者のウェブサイトに移動

hay.hide さんの引用:

そこで
この2行の前に
On Error Resume Next
を記述すると@Aのエラーは出なくなりました。
 
しかし、これだと
業務名が空白の時に登録ボタンを押すとカーソルは業務名には行かずに
氏名に置かれます。(当たり前ですが。。。)

 
エラー番号を調べて 0 ならエラーなしと判断できます。
 
Private Sub 登録ボタン_Click()
    On Error Resume Next
    DoCmd.GoToRecord , , acNewRec
    If Err.Number = 0 Then 'エラーがなければ
        開始時刻.SetFocus
    End If
End Sub

回答
投稿日時: 19/05/07 11:30:28
投稿者: hatena
投稿者のウェブサイトに移動

直接の回答ではないですが、参考までに。
 
入力必須の項目が複数あるときは、下記のリンク先の関数を使うとこーどをシンプルに記述できます。
 
複数項目の入力チェックを共通モジュール化する - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-184.html
 
 
また、使いやすいユーザーインターフェイスを突き詰めて考えると下記のような方法も検討されるといいかと思います。
 
入力必須項目のある入力フォームのUIを考察する - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-446.html

トピックに返信