WorkSpaceを閉じなければエラーは出ないのですが
これは閉じなくても問題がないものなのでしょうか?
はい。閉じてはいけません。
フォームの Recordset オブジェクトにアプローチ可能な状態では
同時に、上位オブジェクト Database のインスタンスも生成されています。
DAO のオブジェクトモデルでは
フォームのセッションで参照された Database オブジェクトも
Workspace オブジェクトの下位オブジェクトであり、
上位オブジェクトが Close メソッドを呼び出した時点で
それに連なる下位オブジェクトの参照は全て破棄されることになります。
Private Sub cmd_ReSet_Click()
Dim wks As DAO.Workspace
On Error GoTo ErrorHandler
Me.Painting = False
Me.RecordSource = vbNullString
Set wks = Access.Application.DBEngine.Workspaces(0)
MsgBox wks.Databases.Count '★★★
wks.BeginTrans
With wks.Databases(0)
.Execute "DELETE FROM M_USER"
.Execute "INSERT INTO M_USER SELECT * FROM W_USER"
.Close
End With
wks.CommitTrans
wks.Close 'この行は不要
ExitProc:
Set wks = Nothing
Me.RecordSource = "M_USER"
Me.Painting = True
Exit Sub
ErrorHandler:
wks.Rollback
MsgBox Err.Description
Resume ExitProc
End Sub
# 提示いただいた cmd_ReSet_Click のコードに
# タイプライブラリ 及び オブジェクト間の上下関係・階層構造を明示しました。
cmd_Count ボタンを押した直後に cmd_ReSet ボタンを押すと
★★★ の実行結果において
1つだけに思える Database オブジェクトの数が
実際は
( フォームで生成された )カレントデータベースの別インスタンス
( Workspaceのインスタンス生成と共に参照された )カレントデータベースの開いているコピー
の2つになっていて
共に wks オブジェクト変数の管理下になっていることが確認できるでしょう。
通報 ...