IMO最も簡単な方法は、.laccdbファイルを削除しようとすることです。そこに存在し、(ロックされているため)削除できない場合、Dbは使用中です。それはすでに開いている場合
Function bDatabaseOpen(strDBPath As String) As Boolean
Dim objWMIService As Object, colProcessList As Object, objProcess As Object
bDatabaseOpen = False
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = 'MSACCESS.EXE'")
For Each objProcess In colProcessList
If Not (IsNull(objProcess.commandline)) Then
If objProcess.commandline Like "*" & strDBPath & "*" Then
bDatabaseOpen = True
End If
End If
Next
Set objProcess = Nothing
Set objWMIService = Nothing
Set colProcessList = Nothing
End Function
私は前に私の元のコードを呼び出すにテストすることができ、その後、その後の対処:私は、私は問題を解決し、この中に別の目的のためにいた別の関数をクローバするために管理
Const TheDB = "C:\DatabaseName.accdb"
Dim DbWasOpen As Boolean
Dim slaccdb As String
slaccdb = Replace(TheDB, ".accdb", ".laccdb")
DbWasOpen = False
If Dir$(slaccdb) <> "" Then
On Error Resume Next
' Try to delete .laccdb
Kill slaccdb
' If that fails, the database is in use
If Err.Number <> 0 Then
DbWasOpen = True
End If
On Error GoTo 0
End If
あなたのコードは既にそれをしています(少なくともOffice 2013では)。私がこれをテストすると、 'AccApp'インスタンスは参照カウントが0のときに閉じます。別のインスタンスでDatabaseName.accdbを開いていると、' AccApp'が有効範囲外になったときに閉じません。 – Comintern