- ベストアンサー
改行数および文字数の制限(追加要望)
https://okwave.jp/qa/q9701482.htmlの続きです。 上司から文字数と行数の制限の他に「入力必須=空欄不可にしてほしい」と追加の要望があり、入力規制に「Is Not Null」を入れても空欄のまま進んでしまいます。 空欄のまま次のテキストボックスへ移動しようとしたら「入力必須項目です。」と表示させて移動させないようにするには、どのようなコードをどこに追加したらよろしいのでしょうか?
- みんなの回答 (15)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (14)
- kkkkkm
- ベストアンサー率66% (1725/2595)
No14の一部訂正です。訂正ばかりですみません。 > チェックの入っていないレコードを選択クエリで抽出し ここは チェックの入っていないレコードをフィルターで絞り込み でいけそうなのでクエリも新しいフォームの作成もなしでいける感じです。
お礼
何度もご回答ありがとうございました。 希望した以上の機能を付与することができましたので、ここで終了とさせていただきます。 空欄スルーは修正入力機能をつければ何とでもなります。 ご教示いただいた機能は他のAccessにも流用できる機能ばかりです。早速採用させていただきます。 本当にありがとうございました。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> 「タブコントロール」とは何でしょう??? デザインモードのコントロール一覧だとフォルダみたいな画像だと思います(バージョンによると思いますので、一概にフォルダみたいとは言えないかもしれませんが) フォームにセットした状態を添付しておきます。 一個は、あ、か、さ、た、な、の所にタブを利用した住所録的なものを作成したものです。住所などの部分はサブフォームになっていてタブコントロールの中にはありません。 あ、か、さ、た、なのところをコマンドボタンで作成もできますが、いっぱい作るのが面倒なのとチェンジのコントロールイベントタブの方が設定しやすかったと思います。 もう一個は、今回のテストのために作成したものです(既定でページ1ページ2のような名前になっています)、ページごとにテキストボックスがありますが、一つのレコードを3ページに分けて入力するようにしています。項目が多くてスクロールしながら入力するのが面倒なものとか、分類ごとにページを分けるとかで利用できると思います。 本題の部分ですが 新規入力のレコードをすべてチェックするとなると、どのレコードが新規入力なのか(過去の入力分もあると思いますので)を識別しなければできませんので、そのあたりをどうするかの検討が必要だと思います。 簡単な方法でしたら、 動作は全てVBAになりますが レポートまで行ったレコードに終了のチェックを入れることで新規入力を判断するとしたら(先にテーブルにそのフィールドを追加しておく必要があります) チェックの入っていないレコードを選択クエリで抽出し、それをフォームで表示する(フォームの作成が必要ですがフィールドなどフォーマットは現在のフォームと同じでいいのでコピーして使えます) 抽出されたレコードの先頭からフォームに表示し現在のコードで未入力チェックをする 未入力がなければ次のレコードを表示してチェックをする 未入力があれば操作を中止する 最後までチェックが問題なく終わったら、それぞれのレコードに終了チェックを入れながらレポートに出力する といった感じかなとは思いますが、現在行っている作業工程を知らないので、上記は何となくで適当で勝手な手順ではあります。
お礼
[No.14] 何度もご回答ありがとうございました。 タブコントロールについての説明ありがとうございました。 なるほど、タブ機能は会社独自のソフトにも採用されています。Accessでも再現できるのですね、勉強になりました。 >レポートまで行ったレコードに終了のチェックを入れることで新規入力を判断する これは入力時点で既定値で入るようにしてあり、レポートを発行したらはずすといった更新クエリーにしています。
- chayamati
- ベストアンサー率41% (260/624)
chayamatiです >空欄のまま次のテキストボックスへ移動しようとしたら 「入力必須項目です。」と表示させて移動させないようにするには、 どのようなコードをどこに追加したらよろしいのでしょうか? 回答No.7のコード試していただきましたが -------------------------------------------- Private Sub 入力必須_Exit(Cancel As Integer) If Len(入力必須) = 0 Then DoCmd.GoToControl "入力必須" End If End Sub --------------------------------------------
お礼
何度もご回答ありがとうございました。 入れてみたのですがそのまま進んでしまったので、No.1のVBAを採用させていただきました。
- kkkkkm
- ベストアンサー率66% (1725/2595)
No9の訂正です。何度もすみません。 レコードの事ではないと思いますが、一応訂正しておきます。 > フォームに表示されているレコードで未入力がなければレポートまで行きますが フォームに表示されているアクティブなレコード(カレントレコード)で未入力がなければレポートまで行きますが
お礼
何度もご回答ありがとうございました。 「ページ」とはレコードの事です。あいまいな表現で申し訳ありませんでした。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> ページをめくるというか、どのページのテキストボックスかを指示する必要があると思います。 と思ったのですが、実際にやってみるとページの指定なくしてボックス名だけで機能しました。 何かが違うのかもしれません。 コードは以下の通りです。 タブページ1に "申請理由1", "ボックス1" タブページ2に "テキスト20", "ボックス2" タブページ3に "ボックス4", "ボックス5" それぞれ配置しています。 Private Sub コマンドボタン_Click() Dim ctrStr As Variant, i As Integer Dim mStr As String: mStr = "" Dim SFflg As Boolean: SFflg = False ctrStr = Array("申請理由1", "ボックス1", "テキスト20", "ボックス2", "ボックス4", "ボックス5") 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 Else DoCmd.Close acForm, Me.Name DoCmd.OpenReport "申請書", acViewReport, "", "", acNormal End If End Sub
お礼
何度もご回答ありがとうございました。 今回ご教示いただいたフォームは、テーブルへの入力用フォームです。 1件ずつ入力する形式になっており、続けて入力する(2件目→3件目→4件目・・・)時は「次ページ」というコマンドボタンをクリックします。 ですので、テーブルには4件入力すれば4件のデータが自動保存されることになります。 フォームには最終決定ボタン(申請書発行)の他に「先頭ページ」「前ページ」「次ページ」「最終ページ」というコマンドボタンを配置してあり、これら4個のボタンはフォームデザインツールの中にあったボタンからウィザードに従って作成したものですので、クリックイベントにVBAが登録されています。
- kkkkkm
- ベストアンサー率66% (1725/2595)
No9の補足というか訂正というか‥‥です。 > ページというのがわからないのですが たぶんタブコントロールのページのことですね。ページをめくるというか、どのページのテキストボックスかを指示する必要があると思います。
お礼
何度もご回答ありがとうございました。 「タブコントロール」とは何でしょう???
- kkkkkm
- ベストアンサー率66% (1725/2595)
> VBA変換したマクロ名を入れてもエラーが出てしまいました。 変換しなくて普通の独立マクロです。オブジェクトの一覧でマクロの項目に表示されるマクロです。 > 1ページ目はすべて入力、2~4ページ目は未入力ありの状態 ページというのがわからないのですが、別のレコードということでしょうか。 表示されているレコードのフォームに存在する該当テキストボックスの未入力を検査していますので、別レコードで入力状態が違うのでしたら個々に反応は変わります。フォームに表示されているレコードで未入力がなければレポートまで行きますが、未入力があればメッセージを表示してそこにとどまります。 複数のレコードを一括して処理するのでいたら、どのレコードを処理するのかの判断材料が必要になりますし、レコードを個々に検査するためのVBA(ページをめくるような動作等)が必要になります。
お礼
何度もご回答ありがとうございました。 「ページ」とはレコードの事です。あいまいな表現で申し訳ありませんでした。
- kkkkkm
- ベストアンサー率66% (1725/2595)
> 上記エラーが無い場合は「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」 No5の最後の所を変更します。 埋め込みマクロだと駄目だと思いますが通常の独立マクロでしたらVBAからマクロを実行できます。 If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical Else DoCmd.RunMacro "マクロ名" End If マクロを実行ではなくVBAだけでしたら If mStr <> "" Then MsgBox mStr & "上記は入力必須項目です。", vbCritical Else DoCmd.Close acForm, "新規入力" '新規入力がVBA実行しているフォームでしたら"新規入力"はMe.Nameでいけます。 DoCmd.OpenReport "申請書", acViewReport, "", "", acNormal End If OpenReportのパラメーターについてはこちらを参照してください。 https://docs.microsoft.com/ja-jp/office/vba/api/access.docmd.openreport また、Accessのバージョンによりますが(たぶん2007以降)だと独立マクロをVBAに変換できますのでそのコードを活用できます。 http://www.k-fix.jp/skill/app/vba_ac/page18.html
お礼
何度もご回答ありがとうございました。 VBA変換したマクロ名を入れてもエラーが出てしまいました。 サブマクロがダメなのかと思い、サブマクロ無しのマクロを新たに作成してもダメでした。 マクロ名の挿入はあきらめて、ご教示いただいたVBAを入れてみたところ、入力必須のテキストボックスに未入力があっても警告表示が出ずにフォームが閉じてレポートが開いてしまいました。 ----------------------------------------------------------- <テスト内容> 1ページ目はすべて入力、2~4ページ目は未入力ありの状態 ↓ 2 or 3 or 4ページ目を表示した状態で最終決定ボタンをクリックすると警告表示が出る。 1ページ目を表示した状態で最終決定ボタンをクリックすると警告表示が出ずにフォームが閉じてレポート表示。 ----------------------------------------------------------- ちなみに、「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」のVBAを入れる前(No.5)では、1ページ目を表示した状態で最終決定ボタンをクリックしても無反応でした。 ここまでやれば当方としては十分なので、これ以上は望まない方がいいのかも知れません。
- chayamati
- ベストアンサー率41% (260/624)
>「既定値(初期値)を入れておく」も考えましたが、 初期値のまま次へ進んでしまう可能性が高いので警告表記が欲しかったのです。 ★その為、テーブルのデザインビューの 値要求を「いいえ」、規定値を「空白」にして その場に留め置く処理はVBAです。 入力必須項目名を"入力必須"とすると -------------------------------------------- Private Sub 入力必須_Exit(Cancel As Integer) If Len(入力必須) = 0 Then DoCmd.GoToControl "入力必須" End If End Sub --------------------------------------------
お礼
3度のご回答ありがとうございました。
- chayamati
- ベストアンサー率41% (260/624)
回答No.2です >それはすでに実施済みです。しかしエラー表示出まくりで ★まともなエラー表示と思いますが これが煩わしいのでしたらマウスカーソルをその場に留め置くことになります 入力必須項目名を"入力必須"とすると -------------------------------------------- Private Sub 入力必須_Exit(Cancel As Integer) If Len(入力必須) = 0 Then DoCmd.GoToControl "入力必須" End If End Sub -------------------------------------------- ★テーブルのプロパティーで 値要求を「はい」 規定値を "がんこより"として 空白を自動発生させない方法もありかな
お礼
再度のご回答ありがとうございました。 「既定値(初期値)を入れておく」も考えましたが、初期値のまま次へ進んでしまう可能性が高いので警告表記が欲しかったのです。
- 1
- 2
お礼
何度もご回答ありがとうございました。 これは短くて良いですね。入力必須のテキストボックスが6個あるので助かります。 さらにお願いがあります。 これは「クリック」イベントでしたね。 元々クリックイベントに「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」というマクロを登録してありました。 ※このフォームが今回ご教示いただいた各テキストボックスを置いてあるフォームです 当方含め部員全員VBAはさっぱり分からないので、すべてマクロで作成して各イベントにそのマクロを登録するという作り方をしています。 先日からいろいろとご教示いただいたVBAはたまたまそれらにかぶることが無かったのでそのまま使用させていただきましたが、今回はクリックイベントなので既存のマクロが使用できなくなってしまいます。 「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」だけならばコードを見ればわかるのですが、このコードを上記VBAにどのように埋め込めばいいのかが分かりません。 上記エラーが無い場合は「ウィンドゥ(フォーム)を閉じる」→「レポートを開く」を実行できるようなコードを追記していただけますでしょうか? ※フォーム名「新規入力」、レポート名「申請書」 何度も申し訳ありませんが、ご教示いただければ幸いです。