| Access Tips by pPoy |
| 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
| |||
|
≪注意≫ この最適化には、DBEngine を使用しています。 Access2000 や Access2002 で、DAO を使用する場合は、予め DAO への参照設定が必要です。 |
☆ 感想をお知らせください (直接ブラウザから送信致します。メールアカウントは不要です。)
form mail はこちら
Copyright(C) pPoy 2002