• ベストアンサー

改行数および文字数の制限(追加要望)

https://okwave.jp/qa/q9701482.htmlの続きです。 上司から文字数と行数の制限の他に「入力必須=空欄不可にしてほしい」と追加の要望があり、入力規制に「Is Not Null」を入れても空欄のまま進んでしまいます。 空欄のまま次のテキストボックスへ移動しようとしたら「入力必須項目です。」と表示させて移動させないようにするには、どのようなコードをどこに追加したらよろしいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.5

No3もNo4も長いので短縮して Arrayのところにコントロール名を入れてください。 Private Sub コマンドボタン_Click() Dim ctrStr As Variant, i As Integer Dim mStr As String: mStr = "" Dim SFflg As Boolean: SFflg = False ctrStr = Array("申請理由", "ボックス1", "ボックス2") For i = 0 To UBound(ctrStr) If IsNull(Me.Controls(ctrStr(i)).Value) Then mStr = mStr & ctrStr(i) & vbCrLf If SFflg = False Then Me.Controls(ctrStr(i)).SetFocus SFflg = True End If End If Next If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical End If End Sub また、ループを使わず一つ一つ記載したい場合にはCase文は冗長でしたので以下でいけると思います。 Private Sub コマンドボタン_Click() Dim mStr As String: mStr = "" Dim flg As Boolean: flg = False If IsNull(Me.申請理由.Value) Then mStr = mStr & "申請理由" & vbCrLf flg = True Me.申請理由.SetFocus End If If IsNull(Me.ボックス1.Value) Then mStr = mStr & "ボックス1" & vbCrLf If flg = False Then flg = True Me.ボックス1.SetFocus End If End If If IsNull(Me.ボックス2.Value) Then mStr = mStr & "ボックス2" & vbCrLf If flg = False Then flg = True Me.ボックス2.SetFocus End If End If If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical End If End Sub

KO1014
質問者

お礼

何度もご回答ありがとうございました。 これは短くて良いですね。入力必須のテキストボックスが6個あるので助かります。 さらにお願いがあります。 これは「クリック」イベントでしたね。 元々クリックイベントに「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」というマクロを登録してありました。 ※このフォームが今回ご教示いただいた各テキストボックスを置いてあるフォームです 当方含め部員全員VBAはさっぱり分からないので、すべてマクロで作成して各イベントにそのマクロを登録するという作り方をしています。 先日からいろいろとご教示いただいたVBAはたまたまそれらにかぶることが無かったのでそのまま使用させていただきましたが、今回はクリックイベントなので既存のマクロが使用できなくなってしまいます。 「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」だけならばコードを見ればわかるのですが、このコードを上記VBAにどのように埋め込めばいいのかが分かりません。 上記エラーが無い場合は「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」を実行できるようなコードを追記していただけますでしょうか? ※フォーム名「新規入力」、レポート名「申請書」 何度も申し訳ありませんが、ご教示いただければ幸いです。

その他の回答 (14)

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.4

No3だと1,2,3が入力順みたいですし対応がわかりにくいので以下の方がいいかもしれません。申請理由、ボックス1、ボックス2のIf文は入力順にした方が未入力箇所のセットフォーカスが前後しないと思います。 Private Sub コマンドボタン_Click() Dim mStr As String: mStr = "" Dim SetF As String: SetF = "" If IsNull(Me.申請理由.Value) Then mStr = mStr & "申請理由" & vbCrLf SetF = "申請理由" End If If IsNull(Me.ボックス1.Value) Then mStr = mStr & "ボックス1" & vbCrLf If SetF = "" Then SetF = "ボックス1" End If End If If IsNull(Me.ボックス2.Value) Then mStr = mStr & "ボックス2" & vbCrLf If SetF = "" Then SetF = "ボックス2" End If End If If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical Select Case SetF Case "申請理由" Me.申請理由.SetFocus Case "ボックス1" Me.ボックス1.SetFocus Case "ボックス2" Me.ボックス2.SetFocus End Select End If End Sub

KO1014
質問者

お礼

3度のご回答ありがとうございました。 大変申し訳ありませんが、うっかりミスをしてしまいました。 詳細はNo.5に記載させていただきました。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.3

文字数の時と同じようなメッセージにして、未入力のボックスにフォーカスを移動します。 Private Sub コマンドボタン_Click() Dim mStr As String: mStr = "" Dim flg As Integer: flg = 0 If IsNull(Me.申請理由.Value) Then mStr = mStr & "申請理由" & vbCrLf flg = 1 End If If IsNull(Me.ボックス1.Value) Then mStr = mStr & "ボックス1" & vbCrLf If flg = 0 Then flg = 2 End If End If If IsNull(Me.ボックス2.Value) Then mStr = mStr & "ボックス2" & vbCrLf If flg = 0 Then flg = 3 End If End If If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical Select Case flg Case 1 Me.申請理由.SetFocus Case 2 Me.ボックス1.SetFocus Case 3 Me.ボックス2.SetFocus End Select End If End Sub

KO1014
質問者

お礼

再度のご回答ありがとうございました。 問題無く動作しました。 大変申し訳ありませんが、うっかりミスをしてしまいました。 詳細はNo.5に記載させていただきました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.2

テーブルのプロパティーで値要求を「はい」とします。

KO1014
質問者

お礼

ご回答ありがとうございました。 説明不足で申し訳ありません。 それはすでに実施済みです。しかしエラー表示出まくりでうっとうしかったのでフォームでの設定をしたかったのです。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.1

Private Sub 申請理由_Exit(Cancel As Integer) If IsNull(Me.申請理由.Value) Then MsgBox "入力必須項目です。" Cancel = True End If End Sub 上記のようにすると入力必須になり申請理由から抜けられなくなります。 いったん申請理由をクリックすると入力するまで抜けられないので、多分苦情が出ると思います。 Cancel = Trueを取るとメッセージだけ出して申請理由から移動します。 ただこのままだと未入力のまま決定終了できてしまうので、最終決定ボタンがあるのでしたらそのボタンのクリックイベントに以下のようにしておくと未入力での決定ができなくなります。 Private Sub コマンドボタン_Click() If IsNull(Me.申請理由.Value) Then MsgBox "申請理由は入力必須項目です。" Me.申請理由.SetFocus End If End Sub

KO1014
質問者

お礼

ご回答ありがとうございました。 できました!! おっしゃるように、一度クリックすると抜け出せなくなりますね。Cancel = Trueは消しておきました。

KO1014
質問者

補足

ついでと言っては失礼になりますが、もう1つお願いがあります。 最終決定ボタンは確かにあります。 未入力時の戻りは他のAccessに設定してあったものをまねっこしてマクロ→Ifで設定してみたのですが、所詮はまねっこなので1つのテキストボックスしか設定できませんでした。 入力必須のテキストボックスが他にも複数あります。 仮に「ボックス1」「ボックス2」とします。 「申請理由」のようにこれらもクリックイベントもしくはマクロ→Ifに埋め込むことは可能でしょうか?

関連するQ&A