Access Tips by pPoy

  
トップへ←Top    QueryへQuery  FormへForm  ReportへReport  Module(Sub)へSub  Module(Function)へFunction  ExcelへExcel  Etc.へEtc.  Word連携へWord

Query VBAによるリンク元 mdb の最適化 (Ac97,Ac2000,Ac2002)
Access2000 からは終了時に自動で自分自身を最適化することができます。
但し、データベースを2つに分けバックエンドとフロントエンドとして運用している場合、
バックエンドの最適化は、やはり手動で行う必要があります。

いちいち別のデータベースを開いて最適化をするのは面倒です。
但し Access に於いて、最適化は必須です。
これをしないとデータベースが確実に壊れやすくなります。

そこで、VBA からリンク元のデータベースを最適化する方法がこれです。

データベースは3個必要です。
  • バックエンド用のデータベース。 テーブルのみを格納したものです。
  • フロントエンド用データベース。 テーブル以外の全てのものを格納してあります。
    通常はこのフロントエンドデータベースを開いて一連の作業を行います。
  • 最適化用のデータベース。これが一番重要です。

フロントエンドデータベースは、必ず 「閉じる」 コマンドボタンで終了します。

この終了時に、最適化用のデータベースを呼び出します。
最適化するデータベースは排他で開く必要があります。
ですので閉じる時のイベントが最適なのです。

最適化用のデータベースは、"msaccess.exe" と同じフォルダに置きます。
これは誤って削除されるのを防ぐ意味と、パスが変わるのを防ぐ意味があります。
また、このデータベースの名称は、閉じるボタンの VBA に書かれたものです。
名前を変更する場合は、ここの部分も変更してください。

≪フロントエンド用データベース≫
「db1_fe.mdb」 は、テーブル以外の全てが格納された mdb です。
ここのメインフォームの「閉じる」ボタンにコードに追加します

フロントエンド
以下のコードを閉じるボタンのクリック時イベントに書きます。

Private Sub cmd終了_Click()
' システム終了時 Access も終了する      2002/01/06 pPoy
On Error GoTo Err_cmd終了_Click
    
    ' 終了時にバックエンドを最適化。
    Dim strPath As String
    Dim varRet As Variant
    Dim strMydb As String       ' 最適化実行mdb
    Dim strLetdb As String      ' 最適化対象mdb
    
    MsgBox "Access終了時にシステムの最適化を行います。" & vbCrLf & _
            "バックグラウンドで作業を行います。" & vbCrLf & vbCrLf & _
            "すべて終了するまで、30秒位 はパソコンの電源を切らないでください。", vbOKOnly
    
    DoCmd.Close acForm, Me.Name, acSaveYes
    
    ' 最適化実行mdbのフルパス
    ' この「最適化M.mdb」は、間違って削除されないように、
    '予めAccessのシステムと同じフォルダに入れておきます。
    strMydb = SysCmd(acSysCmdAccessDir) & "最適化M.mdb"              
    
    ' リンク元のフルパス格納(システムテーブルから読みます)
    strLetdb = DLookup("database", "msysobjects", "type=6")         
    strPath = SysCmd(acSysCmdAccessDir) & "msaccess.exe"
    strPath = strPath & Space$(1) & Chr$(34) & strMydb & Chr$(34) & Space$(1) & _
                "/cmd " & Chr$(34) & strLetdb & Chr$(34)
    
    ' Accessを /cmd 付きで呼び出します。このときの処理は最小化したまま実行します。
    varRet = Shell(strPath, vbMinimizedFocus)

    DoCmd.Quit	' Accessを終了します。

Exit_cmd終了_Click:
    Exit Sub

Err_cmd終了_Click:
    MsgBox Err.Description
    Resume Exit_cmd終了_Click
End Sub

≪最適化実行用データベース≫
「最適化M.mdb」 は、最適化の VBA を実行する mdb です。

「msaccess.exe」 と同一フォルダに置くことが必須です。

これは、閉じるボタンから呼びだされた場合のみ最適化を実行します。
単独で開かれた場合、何もしません。

最適化用のデータベース


また、起動時の設定をします。 方法は、

メニューバーより、「ツール」−「起動時の設定」 を選択します。
ここの、「フォームの表示」 欄に 「F_最適化」 を設定し、OKを押して閉じてください。
以降オープン時には必ずこの 「F_最適化」 が開き、コードが実行されます。
最適化用フォーム


これは、単独で呼び出された場合、表示されるフォームです。
念のため注意書きのみ書いて保存して置きます。勿論ココにかかれたコードが重要です。

フォームには、念のための注意書きをいれて置きます。
そして、このフォームの VBE 画面で、以下のコードを全て貼り付けてください。

Private Sub Form_Load()
    ' 呼び出し元の終了までの時間稼ぎ
    Me.TimerInterval = 3000         '3秒

End Sub



Private Sub Form_Timer() ' 「db1_fe.mdb」から呼び出されたときのみ、「db1_be.mdb」を最適化する。 Dim strMibeDB As String ' 最適化元のdb Dim strKariDB As String ' 仮のdb On Error GoTo Form_Timer_Err 'strMibeDB = ' 最適化したいdbのフルパス+コマンドライン strMibeDB = Command ' このdbを直接開いた場合、そのまま終了 If strMibeDB = "" Then Me.TimerInterval = 0 DoCmd.Close Exit Sub End If strKariDB = "C:\My Documents\仮db.mdb" ' 仮dbのフルパス ' 仮dbを削除 subFileDel (strKariDB) DoEvents ' 最適化 DBEngine.CompactDatabase strMibeDB, strKariDB ' 仮dbを元dbにコピーし、仮dbを削除 subFileDel (strMibeDB) FileCopy strKariDB, strMibeDB subFileDel (strKariDB) DoCmd.Quit Exit Sub Form_Timer_Err: If Err.Number = 3054 Or Err.Number = 3356 Then If MsgBox(strMibeDB & " は、使用中です。" & vbCrLf & vbCrLf & _ "最適化を中止しますか?", vbExclamation + vbYesNo) = vbYes Then DoCmd.Quit End If Else MsgBox "実行時エラー'" & Err.Number & "': " & vbCrLf & vbCrLf & _ Err.Description, vbCritical End If Exit Sub End Sub



Public Sub subFileDel(str As String) ' ファイル削除用のサブルーチン On Error GoTo subFileDel_Err ' 削除するファイルが無い場合、何もしない Kill str Exit Sub subFileDel_Err: Exit Sub Resume End Sub
≪注意≫

この最適化には、DBEngine を使用しています。
Access2000 や Access2002 で、DAO を使用する場合は、予め DAO への参照設定が必要です。



【念の為の注意書きです。】
このページ(下位ページ含む)の全ての物の無断転載を禁止いたします。又、当ページ(下位ページ含む)に記載されていることは、全て自己の責任において実行してください。

☆ 感想をお知らせください (直接ブラウザから送信致します。メールアカウントは不要です。)
  form mail はこちら

Copyright(C) pPoy 2002