#09 VBAを使ってデータベースを修復/最適化

Accessを使ったデータベースアプリケーションにおいて、開発中はもとより、導入してからも必須の作業といえるデータベースの修復と最適化の操作について、VBAを使ってアプローチしてみましょう。
 
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]


※他にもいくつかパラメータがあります。それらについてはAccessのヘルプをご参照下さい。

例:
  '最適化元の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
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved