こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2015-04-03 15:22:47

QNo.8948399

すぐに回答ほしいです

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

チェックを入れてからでは遅いので・・というか
状況によっては面倒な後処理をする手間がでますから、
チェックを入れる段階で、もし新しいレコードに
チェックを入れようとしたときに、「待った」を
かけるようにしたらどうでしょうか。たとえば、以下のように。

Private Sub チェック_Click()
If Me.NewRecord Then
If MsgBox("新しいレコードにチェックを入れようとしています。このまま続行しますか?", vbYesNo) = vbNo Then
Me.Undo
End If
End If
End Sub

なお、この方法はもしIDなどがオートナンバーで
設定してある場合は、見た目はデータが保存されませんが、
内部的にはオートナンバーが一つ進んでいます。
それだけは認識しておいてください。

この方法以外に、サブフォームを表示しようとした場合には
当然ながらレコードを破棄する必要がありますから、そうなれば
一旦、サブフォームを表示してから空レコードを破棄しても
いいですし、できるならば開くときのイベントで破棄しても
いいかもしれません(これは試してみないので確認は
してみますが)
たちまちには、一旦このような回答にしておきます。
一応、確認の時間稼ぎです。

投稿日時 - 2015-04-03 19:35:38

お礼

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

投稿日時 - 2015-04-04 07:56:56

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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
が残っていました。これはコメントアウトするか削除してください。

投稿日時 - 2015-04-03 17:43:29

ANo.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

のような感じでもいいのでは、と思いますが。


いずれにしても、開くフォームにレコードソースが
設定してあるのか、。あるいはフォームの構造など
により方法は少し変わると思います。

投稿日時 - 2015-04-03 16:46:56

補足

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

'End Sub

投稿日時 - 2015-04-03 17:44:32

ANo.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

投稿日時 - 2015-04-03 16:43:58

あなたにオススメの質問