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
コメント