| Access 終了時に最適化する方法 |
対象バージョン : 7.0, 95
最終更新日 : 1999/02/03 (オリジナル作成日 : 1998/12/13)
概 要
Access で最適化を行う方法として、メニューの [ツール(T)] - [データベースユーティリティ(D)...] - [最適化(C)] があり、これを SendKeys ステートメントで実現できます。
SendKeys "%TDC"
ただし、この方法では、確実な動作が期待できません。
このため、次の手順により、最適化を行うようにします。
1.Access を起動して他の mdb
ファイルを開き、呼び出し側は終了します。
2.呼び出された側で、呼び出した mdb
を最適化して終了します。
解 説
1.呼び出される側の mdb の作成
(1) モジュールの作成
《宣言》
' 一時ファイル名取得用 API の宣言
Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" _
(ByVal lpszPath As String, ByVal lpPrefixString As String, _
ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
《プロシージャ》
' 一時ファイル名の取得
Public Function udGetTempFileName(argPath) As String
Dim lngRet As Long
Dim strFileName As String * 255
lngRet = GetTempFileName(argPath, "acc", 0&, strFileName)
udGetTempFileName = Left(strFileName, InStr(strFileName, vbNullChar) - 1)
End Function
' フルパス名からディレクトリ名(フォルダ名)の取得
Public Function udGetFolderName(argPath) As String
Dim lngPos As Long
For lngPos = Len(argPath) To 1 Step -1
If Mid(argPath, lngPos, 1) = "\" Then
udGetFolderName = Left(argPath, lngPos)
Exit Function
End If
Next
End Function
(2) フォームの作成
フォームのプロパティ "タイマ間隔" に 3000
を設定。
この値は、呼び出し側の Access
を終了するまでの時間稼ぎに使用します。適宜変更してください。
フォームのプロパティ "タイマ時" にイベントプロシージャを作成。
Private Sub Form_Timer()
Dim strSrcDB As String
Dim strDstDB As String
Dim lngRet As Long
On Error GoTo Form_Timer_Err
strSrcDB = Command
If strSrcDB = "" Then ' この mdb を直接開いた場合の判断
Me.TimerInterval = 0
DoCmd.Close
Exit Sub
End If
strDstDB = udGetTempFileName(udGetFolderName(strSrcDB))
' Windows API GetTempFileName はファイルを作成するため削除
Kill strDstDB
DoEvents ' 念のため入れてあります
DBEngine.CompactDatabase strSrcDB, strDstDB
Kill strSrcDB ' 最適化前の mdb ファイルの保存が必要であれば、Name で変更
Name strDstDB As strSrcDB
'【注1】 元の mdb ファイルを開きなおす場合
' DoEvents
' lngRet = Shell(strSrcDB)
DoCmd.Quit
Exit Sub
Form_Timer_Err:
If Err.Number = 3054 Or Err.Number = 3356 Then ' 【注2】再実行するエラーコード
If MsgBox(strSrcDB & " は使用中です。" & 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
(3) マクロの作成
上記 (2) で作成したフォームを開くマクロを作成し、"AutoExec"(ダブルクオーテーションは不要)という名前で保存します。
2.呼び出し側での終了の方法
次のようなプロシージャで終了します。
Dim strPath As String Dim lngRet As Long strPath = SysCmd(acSysCmdAccessDir) & "msaccess.exe " strPath = strPath & "上記 1 で作成した mdb ファイルのフルパス名" strPath = strPath & " /cmd" & CurrentDb.Name lngRet = Shell(strPath, vbMinimizedFocus) DoCmd.Quit
補 足
改訂履歴
99/02/03 変数名訂正 srcDB → strSrcDB