|
Accessではレコードの削除を繰り返したりするとすぐにMDBファイルのサイズが膨らんでしまいます。「最適化」はAccessのみならず、データベースソフトでは必須の作業といえるでしょう。ソフトによっては"インデックスの再編成"と言ったり、"テーブルの圧縮"と言ったりしますが、いずれもテーブル内の不要な領域(主に削除されたレコードの領域)を整理整頓してデータベースのサイズを小さくしてくれることに違いはありません。
Access97になってからは自分自身のデータベースを閉じずにそのまま修復/最適化できるようになり、以前のバージョンに比べてその操作がずいぶん楽になったように思います。しかし、個人的には、明らかにデータベースがおかしくなった時ではなく、ある程度定期的に「修復」も行うようにしているので、修復と最適化を別々に行わなければならないのはやはり面倒です。またすでに導入されているデータベースのメンテナンスにおいても、コマンドラインオプションを設定してそれ用のショートカット(※注)を作ったとしても、複数のMDBファイルを1つずつ修復/最適化するのもやはり面倒な作業です。 |
そこでここでは、複数のMDBファイルに対しても応用できる、VBAを使っての修復/最適化の方法を説明したいと思います。なお、アドインで、現在開かれているデータベースに対して修復/最適化を行うには
SendKeys ステートメントを使ったりしなければならないようで、いろいろ試行錯誤した結果、動作の安定性なども含めてうまく行かなかったため、T'sKitの「修復/最適化一括実行」ツールでは閉じているデータベース、つまりディスク上のMDBファイルに対してだけ修復/最適化を行うようにしました。ここではあくまでもそれに基づいて説明していきたいと思います。
C:\Access97\MSACCESS.EXE c:\db1.mdb /compact /repair |
|
まず「修復」ですが、これはいたって簡単です。次の1行のコードを実行するだけです。
DBEngine.RepairDatabase [MDBファイル]
例:
DBEngine.RepairDatabase "c:\access\db1.mdb"
一方、「最適化」も1行のコードで実行できるのですが、若干の後処理が必要です。Access97のメニューの[データベースユーティリティ]から[最適化]を実行するのとは異なり、必ず最適化先のMDBファイルを指定しなければなりません。しかもそのファイルは最適化元のMDBファイル(最適化前の今あるMDBファイル)とは違う名前を指定しなければなりません。
したがって通常は、最適化が完了したら最適化元のファイルを削除して、最適化先のMDBのファイル名を最適化元のファイル名にリネームする必要があります。それらの後処理も含めたコードを次に示します。 |
DBEngine.CompactDatabase
[最適化元MDB],
[最適化先MDB]
例:
'最適化元のMDBファイル名
Dim strSrcMDB As String
'最適化先のMDBファイル名
Dim strDstMDB As String
strSrcMDB = "c:\access\db1.mdb"
strDstMDB = "c:\access\~tmpdb1.mdb"
'最適化の実行
DBEngine.CompactDatabase strSrcMDB, strDstMDB
'最適化元のファイルを削除
Kill strSrcMDB
'最適化先のファイル名を最適化元のファイル名にリネーム
Name strDstMDB As strSrcMDB
|
|
最後に、参考までに応用例として、特定のフォルダにある複数のMDBファイルを一括して修復/最適化するコードを紹介します。
'検索するフォルダ
Dim strCurPath As String
'検索されたファイル名
Dim strFindFile As String
'最適化元のMDBファイル名
Dim strSrcMDB As String
'最適化先のMDBファイル名
Dim strDstMDB As String
'検索するフォルダを指定
strCurPath = "c:\access\"
'そのフォルダの最初のMDBファイルを検索
strFindFile = Dir(strCurPath & "*.MDB")
Do While strFindFile <> ""
'見つかったら修復/最適化を実行
|
'最適化元のMDBファイルのフルパスを設定
strSrcMDB = strCurPath & strFindFile
'最適化先の一時MDBファイルのフルパスを設定
strDstMDB = strCurPath & "~tmp" & strFindFile
'修復の実行
DBEngine.RepairDatabase strSrcMDB
'最適化の実行
DBEngine.CompactDatabase strSrcMDB, strDstMDB
'最適化元のファイルを削除
Kill strSrcMDB
'最適化先のファイル名を最適化元のファイル名にリネーム
Name strDstMDB As strSrcMDB
'次のMDBファイルを検索
strFindFile = Dir
Loop
|