外部MDBのコンパイル方法

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です