• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームへの未入力を無くしたい)

フォームへの未入力を無くす方法

このQ&Aのポイント
  • フォームの未入力「コンボボックス」と「テキストボックス」を事前に把握する方法をご提案します。
  • フォームの構成を生かし、未入力箇所が発生しないようにする方法をお伝えします。
  • コンボボックスへの選択入力を必須にし、テキストボックスの未入力箇所を特定する方法をご紹介します。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1718/2588)
回答No.6

VBAの画面(VBE)が開きにくいのは問題ですね。 AccessのDBファイルの最適化/修復はたまにやられていると思うのですが、Officeの修復を試してみてはいかがでしょう。 VBEの調子が悪い時にプロシージャを設定するのも怖い感じですが、疑問点に関する説明を記載しておきます。 > クリック時の設定になっている現在のマクロを消して、新たにプロシーシャを選択して以下をコピーすればよろしでしょうか。 はい、ただし今回のプロシージャを設定して、閉じるボタンのクリックで動作がおかしかったりエラーが出なければ変更しなくても大丈夫だと思います。 > データベースでVisual Basicを起動させ、アドバイスの記述「以下」をコピーすれば宜しいでしょうか。 更新前処理の設定でコードビルダーを選択したらVBEが開きますので、そこで更新前処理のコードを記載してください。 開いた時に Private Sub Form_BeforeUpdate(Cancel As Integer) End Sub となっているので Cancel = BlankCtl(Me.Name) を追加するだけです。 そこでその状態で、メニューの「表示」で「プロジェクトエクスプローラー」を選択したら左ペインが出てこないでしょうか。 そこで左ペインが開かないとなると、メニューの「挿入」で「標準モジュール」を追加すると タイトルバーにModule1とか出てると思いますので、右ペインに Public Function BlankCtl(ByVal MFormName As String) As Boolean から End Function までをコピペしてください。 これは一ファイルにたいして一度です。 蛇足ですが Microsoft Visual Basic だけだと別のものになります。 AccessなどOffice製品で使うものは VBA(Visual Basic for Applications) その編集画面は VBE(VisualBasicEditor) と記載したほうが勘違いが無くていいと思います。

eokwave
質問者

お礼

ありがとうございます。牛歩のごとくですが、頑張って進めてまいります。まだまだ、データベースは完成の域では無いとの認識ですので、この気持ちを持ち続けたいと思っております。今後もよろしくお願いします。 お陰様で、なんとかデータベースを利用できる様になって居ります。実は、定年間際に営業部門から集計業務部門に異動(私以外は20代~30代の社員)させられた経験があります。出来るわけがないとの視線を強く感じたものです。幸いにもACCESSソフトを知っていたことと、親身なアドバイスのお陰で他の誰よりも早く、集計業務をこなすことができるようになり、なんとか定年まで勤めあげれた過去を持っております。感謝の気持ちを込めて、比較的利用する機会のあるデータベースの一部をご紹介します。感謝です。 「利用があるデータベース」 ◆購入品管理「保証期間の管理、交換部品の交換日管理」◆在庫管理「適正在庫と現在庫、他」◆医療関係「予約日管理、診療履歴(医師名・処置名・他)、投薬情報、健康情報、各種保険管理、他」◆食材管理「消費期限の管理、他」◆名簿管理「親戚縁者、知人、友人」◆金言名言集「時々見ます」◆情報日記「経験と情報(フリー記載)」◆パソコン管理「不具合履歴と対処情報、各種登録情報の履歴管理、他」◆ネットのアドレス管理「URLの登録と情報検索」◆家事情報「不具合履歴と対処情報、他」◆生活電話帳「随時登録、メモ、メール、URL、他」◆資格管理「資格期限、管轄元情報(書類・費用・他)」◆書類備品管理「書類の保管場所(机の引出2段目とか)、備品の保管場所、他」◆ACCESS情報管理「アドバイスの履歴、他」 「データベース利用が高まった背景」 私、まめにデータの蓄積は行っていたのですが、蓄積されたデータを上手く使えなかった時期が長くありました。その最大の原因が検索性の悪さだと、親身なアドバイスで気付かされました。フリー検索での「AndとOr」の違いとか、ドルグボタンでの並び替えとか、沢山のアドバイスのお陰で便利に使っています。正に、アドバイスに対する感謝の気持ちしかありません。ありがとうございます。感謝。

その他の回答 (5)

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

No4で一部間違いがありました。終了の時に「いいえ」にしたら次から未入力チェックをしなくなってました。 閉じるボタンの If BlankCtl() = False Then DoCmd.Close acForm, Me.Name End If を If BlankCtl() = False Then DoCmd.Close acForm, Me.Name Else Me.BeforeUpdate = "[イベント プロシージャ]" End If あと、Function BlankCtlをフォーム毎に記載しなくてもいいようにしたい場合(そのファイル全体で使える) これまでは無視して全てを以下のようにしてください。 更新前処理 Private Sub Form_BeforeUpdate(Cancel As Integer) Cancel = BlankCtl(Me.Name) End Sub 閉じるボタン Private Sub フォームを閉じるボタン_Click() Me.BeforeUpdate = "" If Me.Dirty = True Then If BlankCtl(Me.Name) = False Then DoCmd.Close acForm, Me.Name Else Me.BeforeUpdate = "[イベント プロシージャ]" End If Else DoCmd.Close acForm, Me.Name End If End Sub フォームは以上で、以下のコードは同じファイルの全てのフォームから参照できるように 以下添付画像参照してください。 標準モジュールを追加してModule1のところに Public Function BlankCtl(ByVal MFormName As String) As Boolean Dim ctl As Control Dim Cancel As Boolean Dim MForm As Form Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acTextBox Or .ControlType = acComboBox Then If Nz(ctl) = "" Then MsgBox ctl.Name & "が未入力です", vbCritical Cancel = True End If End If End With Next ctl If Cancel = True Then If MsgBox("未入力のままでよろしいですか?", vbYesNo + vbInformation + vbDefaultButton2) = vbYes Then Cancel = False End If End If BlankCtl = Cancel End Function

eokwave
質問者

お礼

ご返事が大変遅れまして申し訳ございません。 データベースがかなり重くなっている様でして、Microsoft Visual Basic を起動するに時間を要する状況です(但し、データベースの使用では全く問題ありません)。応答なし・・・、タスクバーが非アクティブで固まったり。そんな状況です。そこで提案ですが、一旦、終了させて再度参戦させていただければと考えて居ります。過去、kkkkkm様のアドバイスは全て「ベストアンサー」のクオリティーでもあり、知識レベル「まず頭で理解」での習得であっても問題ないと思います(作業は牛歩のごとく・・・)。 私のレベルの低さで申し訳ございません、アドバイスに即反応できない部分もあり、その点だけ再度のお尋ねさせて下さい。理解できた段階で、一旦、終了したいと思います。ご理解いただければ幸いです。 [全ての入力フォームへの対応] 1,更新前処理   Private Sub Form_BeforeUpdate(Cancel As Integer)   Cancel = BlankCtl(Me.Name)   End Sub 2,閉じるボタン 「再度お尋ね」 現在は閉じるボタンを選択「イベントのクリックでマクロを選びアクションで(閉じる)を選択」しています。従って、クリック時の設定になっている現在のマクロを消して、新たにプロシーシャを選択して以下をコピーすればよろしでしょうか。   Private Sub フォームを閉じるボタン_Click()   Me.BeforeUpdate = ""   If Me.Dirty = True Then    If BlankCtl(Me.Name) = False Then    DoCmd.Close acForm, Me.Name    Else    Me.BeforeUpdate = "[イベント プロシージャ]"    End If   Else    DoCmd.Close acForm, Me.Name   End If   End Sub [データベースへの対応] 「再度お尋ね(未熟で申し訳ございません)」 データベースでVisual Basicを起動させ、アドバイスの記述「以下」をコピーすれば宜しいでしょうか。しかし、Visual Basicを起動させてみて、左ペインに「アイコン(Microsoft Access・・・)」を表示させられない状況です。申し訳ございません。 Public Function BlankCtl(ByVal MFormName As String) As Boolean Dim ctl As Control Dim Cancel As Boolean Dim MForm As Form Set MForm = Forms(MFormName) For Each ctl In MForm.Controls With ctl If .ControlType = acTextBox Or .ControlType = acComboBox Then If Nz(ctl) = "" Then MsgBox ctl.Name & "が未入力です", vbCritical Cancel = True End If End If End With Next ctl If Cancel = True Then If MsgBox("未入力のままでよろしいですか?", vbYesNo + vbInformation + vbDefaultButton2) = vbYes Then Cancel = False End If End If BlankCtl = Cancel End Function

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

先のファームを閉じるボタンでは2回チェックが入りましたので、以下に変更してみてください。編集中でなければ未入力チェックはしません。 Private Sub フォームを閉じるボタン_Click() Me.BeforeUpdate = "" If Me.Dirty = True Then If BlankCtl() = False Then DoCmd.Close acForm, Me.Name End If Else DoCmd.Close acForm, Me.Name End If End Sub

eokwave
質問者

お礼

ご返事が遅れております。申し訳ございません。最終のアドバイスのお礼にてご説明です。

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

>フォームへの未入力を無くしたい  長年に渡り作成できたデータベースが「68」、入力するフォームは「78」を超えます。 ----------------------------------------------------------------------- 失礼ですが、ご質問の焦点がボケています。 1.入力フォームの選択漏れなら  スーパのトイレの当番表のチェックシートのようなものを  テーブル化(ID,日付、フォーム名、担当名)  重複登録を回避するため  日付とフォーム名の2つのフィールドを主キーにする 2.フォーム内の項目なら  フォームまたはクエリ、コンボボックスのレコードソースの  テーブルのフィールドのプロパティーの値要求を「はい」にする  添付図は顧客名のプロパティーです

eokwave
質問者

お礼

貴重なアドバイスありがとうございます

  • kkkkkm
  • ベストアンサー率66% (1718/2588)
回答No.2

No1はイベントプロシージャです。 フォームの全てのテキストボックスとコンボボックスの未入力を調べて未入力があればその都度コントロールの名前をメッセージします。 閉じる場合は編集中でなくてもメッセージが出ます。レコードの移動などの場合は編集中でない場合メッセージが出ません。

eokwave
質問者

お礼

ご返事が遅れております。申し訳ございません。最終のアドバイスのお礼にてご説明です。

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

フォームの更新前処理 Private Sub Form_BeforeUpdate(Cancel As Integer) Cancel = BlankCtl() End Sub ここまで ------------------------------------- フォームの更新前処理と同じところに Private Function BlankCtl() As Boolean Dim ctl As Control Dim Cancel As Boolean For Each ctl In Me.Controls With ctl If .ControlType = acTextBox Or .ControlType = acComboBox Then If Nz(ctl) = "" Then MsgBox ctl.Name & "が未入力です", vbCritical Cancel = True End If End If End With Next ctl If Cancel = True Then If MsgBox("未入力のままでよろしいですか?", vbYesNo + vbInformation + vbDefaultButton2) = vbYes Then Cancel = False End If End If BlankCtl = Cancel End Function ここまで ------------------------------------------------- 閉じるのマクロでエラーになった場合こちらにしてください。 Private Sub フォームを閉じるボタン_Click() If BlankCtl() = False Then DoCmd.Close acForm, Me.Name End If End Sub

eokwave
質問者

お礼

ご返事が遅れております。申し訳ございません。最終のアドバイスのお礼にてご説明です。

関連するQ&A

専門家に質問してみよう