外部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
よかったらシェアしてね!

この記事を書いた人

コメント

コメントする

目次
閉じる