• ベストアンサー

accessでブランクフォームをクローズさせる

フォームに何のデータもない場合、その画面をクローズさせる場合のVBAを教えてください。 タイミング的にはフォームを開いた時に判断したいです。 宜しくお願い致します。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

チェックを入れてからでは遅いので・・というか 状況によっては面倒な後処理をする手間がでますから、 チェックを入れる段階で、もし新しいレコードに チェックを入れようとしたときに、「待った」を かけるようにしたらどうでしょうか。たとえば、以下のように。 Private Sub チェック_Click() If Me.NewRecord Then If MsgBox("新しいレコードにチェックを入れようとしています。このまま続行しますか?", vbYesNo) = vbNo Then Me.Undo End If End If End Sub なお、この方法はもしIDなどがオートナンバーで 設定してある場合は、見た目はデータが保存されませんが、 内部的にはオートナンバーが一つ進んでいます。 それだけは認識しておいてください。 この方法以外に、サブフォームを表示しようとした場合には 当然ながらレコードを破棄する必要がありますから、そうなれば 一旦、サブフォームを表示してから空レコードを破棄しても いいですし、できるならば開くときのイベントで破棄しても いいかもしれません(これは試してみないので確認は してみますが) たちまちには、一旦このような回答にしておきます。 一応、確認の時間稼ぎです。

chi_ko6262
質問者

お礼

毎度、毎度ありがとうございます。平凡な言葉しか出てきませんが、心から感謝しています。 本当にありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

訂正です。No2の二つの例について 両方とも Private Sub Form_Open(Cancel As Integer) ではなく、 Private Sub Form_Load() としてください。 Form_Openではデータなどがフォームにセットされる前なので Form_Loadのイベントにします。 なお、No2の最初のコードの変数の宣言のところで Dim rs As DAO.Recordset Dim ctl As Control と、いらない Dim ctl As Control が残っていました。これはコメントアウトするか削除してください。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>フォームに何のデータもない場合 この場合、状況はいろいろ考えられますが、 (1) テキストボックスなどがフォームの  レコードソースと連結している場合。 (2)テキストボックスなどがすべて非連結  の場合 (3)連結と非連結が混在するばあい などがあります。 (1)の場合 Private Sub Form_Open(Cancel As Integer) Dim rs As DAO.Recordset Dim ctl As Control Set rs = Me.RecordsetClone If rs.RecordCount = 0 Then MsgBox "フォームを閉じます" DoCmd.Close acForm, Me.Name End If End Sub でいいかもしれません。 あるいは、(1),(2),(3)ともに、 Private Sub Form_Open(Cancel As Integer) Dim ctl As Control Dim i As Long i = 0 For Each ctl In Me.Controls  If TypeOf ctl Is TextBox Then   If Not IsNull(ctl) Then    i = i + 1   End If End If Next ctl If i = 0 Then  MsgBox "フォームを閉じます"  DoCmd.Close acForm, Me.Name End If End Sub のような感じでもいいのでは、と思いますが。 いずれにしても、開くフォームにレコードソースが 設定してあるのか、。あるいはフォームの構造など により方法は少し変わると思います。

chi_ko6262
質問者

補足

返事ありがとうございます。補足不足でうまく伝わっていないようです。 以前チェックボックスで選択したデータをサブフォームに移す仕様にしたのですが、データ群の中の一番下がブランクでチェックボックスもあります。そのチェックボックスにチェックを入れてOPENするとブランクのフォームが出てきます。これをすると空のデータフィールドが1つ出来てしまいます。このバグを潰したいと思っています。 現在、下記の様にしてますが、空フィールドはできてしまいます。 Private Sub Form_Load() If IsNull(Me!ID) = True Then MsgBox "編集できません" DoCmd.Close acForm, Me.Name End If またお知恵を拝借できないでしょうか。 宜しくお願い致します。 'End Sub

すると、全ての回答が全文表示されます。
回答No.1

Option Compare Database Option Explicit Private Sub Form_Load()   If Me.Recordset.RecordCount = 0 Then     DoCmd.Close acForm, Me.Name   End If End Sub

すると、全ての回答が全文表示されます。

関連するQ&A