午後5時ですので、処理コード8行を示しておきます。
Private Sub Form_Close()
Dim N As Integer
Dim strWhere As String
strWhere = "Len(確認日 & '')"
N = DBCount("確認日", "tab1", strWhere)
If N Then
MsgBox "必須フィールドの入力漏れのレコードが" & N & " 件見つかりましたので削除します。"
CnnExecute "DELETE * FROM tab1 WHERE " & strWhere
End If
End Sub
これで、入力フォームを閉じる時に不具合レコードは削除されます。
tab1:
ID__確認日
1___2008/10/09
2_____________ <-- 不具合レコード
具体的には、[ID=2]のレコードが削除されます。
フォームに書くVBAのコードは、8行程度です。
が、その中で DBCount関数、CnnExecute関数を使っています。
ですから、次のような自作関数を標準モジュールに登録する必要があります。
Accessには DCount関数が用意されていますが、DBCount関数が3倍速で動作します。
まあ、入力フォームを閉じる時の処理で時間がかかるのも問題なのでDBCount関数を使用しています。
Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & CnnErrors.Description & Chr$(13) & _
"・Err.Number=" & CnnErrors.Number & Chr$(13) & _
"・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
"・SQL Text=" & strSQL, _
vbExclamation, " ADO関数エラーメッセージ"
End Sub
Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
Dim isOK As Boolean
Dim cnn As ADODB.Connection
isOK = True
Set cnn = CurrentProject.Connection
With cnn
.Errors.Clear
.BeginTrans
.Execute strSQL
.CommitTrans
End With
Exit_CnnExecute:
On Error Resume Next
cnn.Close
Set cnn = Nothing
CnnExecute = isOK
Exit Function
Err_CnnExecute:
isOK = False
If cnn.Errors.Count > 0 Then
ErrMessage cnn.Errors(0), strSQL
cnn.RollbackTrans
Else
MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
vbExclamation, " 関数エラーメッセージ"
End If
Resume Exit_CnnExecute
End Function
Public Function DBCount(ByVal strField As String, _
ByVal strTable As String, _
Optional ByVal strWhere As String = "", _
Optional ByVal ReturnValue = 0) As Variant
On Error GoTo Err_DBCount
Dim N
Dim strQuerySQL As String
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable
If Len(strWhere) > 0 Then
strQuerySQL = strQuerySQL & " WHERE " & strWhere
End If
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
.MoveFirst
N = .Fields(0)
End If
End With
Exit_DBCount:
On Error Resume Next
rst.Close
Set rst = Nothing
DBCount = IIf(N <> 0, N, ReturnValue)
Exit Function
Err_DBCount:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBCount
End Function
お礼
ありがとうございました。