Visual Basic でも動きます。
DAOとAccess Applicationの両方の参照設定が必要です。
ここでのポイントは、以下のようにCreateObject()時にAccessのバージョンを指定してしまわないことです。
Set objAccess = CreateObject("Access.Application.14")
バージョンをしてしまうとそのバージョンのAccessがインストールされていない場合はActiveXコンポーネントは生成できませんというエラーが発生して汎用性が損なわれます。
Public Function CompileMDB(ByVal lc_MDB As String) As Long
On Error GoTo SysError_Handler
Dim objAccess As Access.Application
Dim objDb As Database
Dim strModule As String
Const C_acCmdCompileAndSaveAllModules As Long = 126
Const C_acModule As Long = 5
Const C_acQuitSaveNone As Long = 2
Set objDb = OpenDatabase(lc_MDB)
If objDb.Containers("Modules").Documents.Count = 0 Then
GoTo Exit_Handler
End If
strModule = objDb.Containers("Modules").Documents(0).Name
Set objAccess = CreateObject("Access.Application")
objAccess.OpenCurrentDatabase lc_MDB
objAccess.docmd.openmodule strModule
If objAccess.IsCompiled = False Then
objAccess.docmd.RunCommand C_acCmdCompileAndSaveAllModules
If (Not objAccess.IsCompiled) Then
'コンパイル失敗
GoTo Error_Handler
End If
End If
objAccess.docmd.Close C_acModule, strModule
objAccess.CloseCurrentDatabase
objAccess.Quit C_acQuitSaveNone
Exit_Handler:
CompileMDB = 0
If (Not objAccess Is Nothing) Then
Set objAccess = Nothing
End If
Exit Function
Error_Handler:
CompileMDB = 9
GoTo Exit_Handler
SysError_Handler:
CompileMDB = 9
Call MsgBox(Error, vbOKOnly + vbCritical)
Resume Exit_Handler
End Function
コメント