ExcelからAccessデータベースの最適化をする

Accessのデータベースって、テーブルデータを削除、追記、追加などしていく内に、どんどんファイルサイズが大きくなっていきますよね
そのまま放置しているとだんだんモッサリ感でてきませんか?
また、Accessでデータベースを開いて最適化する・・・って面倒だし、つい忘れてしまうことってありますよね
この部屋では、ExcelからAccessのデータベースを最適化する処理をサブルーチン化して掲載していますよ!!
別部屋「404号室:Accessデータベースのテーブル情報を削除」などを行った後にこのサブルーチンを実行するとスムーズかなと思います(Kappo談)
また、一番したの方にコメント欄があるからよかったら質問・感想などメッセージ入れてください。
Accessでテーブルを作成する
※テーブルの作成は 「VBA:Accessデータベースの情報を取得ー別部屋」を参照してください
プログラム(例)
データベース(Access)の準備が出来たので取得のプログラムを記述します
コマンドボタンがクリックされた時に実行されるプログラム
「Button2」
※「vb.net 301号室:データベースから情報を取得」で作成したフォームにボタンを追加して処理プログラムと記載します

Accessデータベースを最適化するサブルーチンは、メニューー>プロジェクト-モジュール の追加(名前は”MdbCtrl”にしました)して準備します
最適化するサブルーチン
・引数:mdbFolder=データベースのフォルダ
mdbName = データベース名
・戻り値:正常終了=True
異常終了=False
最適化の手順
①データベースを別名で最適化
②元データベースを別名にしてバックアップ(上書きコピー)
③最適化したデータベースを元名で上書きコピー
④ ①のファイルを削除
▼プログラム▼
Module MdbCtrl
'--------------------------------------------------------------------------------
Public Function MdbOptimization(mdbFolder As String, mdbName As String)
'----------------------------------------
Dim Ret As Boolean
Ret = True
'----------------------------------------
Dim mdbFName As String = ""
Dim afterName As String = ""
Dim backupName As String = ""
Dim buf
mdbFName = mdbFolder & "\" & mdbName '元ファイルのフルパス
buf = Split(mdbName, ".") 'ファイル名を拡張子で分ける
afterName = mdbFolder & "\" & buf(0) & "_after." & buf(1) '最適化の一時ファイルのフルパス
backupName = mdbFolder & "\" & buf(0) & "_backup." & buf(1) '元MDBのバックアップファイルのフルパス(念のため)
'----------------------------------------
Dim Db_Engine As Object
Db_Engine = CreateObject("DAO.DBEngine.120") 'DAOオブジェクト
'----------------------------------------
Try
'最適化一時ファイル作成:base->after
Db_Engine.CompactDatabase(mdbFName, afterName)
'バックアップ:base->backup
System.IO.File.Copy(mdbFName, backupName, True)
'最適化を戻す:after->base
System.IO.File.Copy(afterName, mdbFName, True)
'最適化一時ファイルを削除:after
System.IO.File.Delete(afterName)
Catch ex As Exception
Debug.Print(ex.Message)
Ret = False
End Try
'----------------------------------------
MdbOptimization = Ret
'----------------------------------------
End Function
End Module

最適化を呼び出すプログラム(例:「Button3」)
▼プログラム▼
'------------------------------------------------------------------
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim mdbFolder As String 'データベースのフォルダ
Dim mdbName As String 'データベース名
'--------------------------------------------
mdbFolder = "C:\Sample\DB"
mdbName = "Sample.accdb"
'--------------------------------------------
Dim ret As Boolean
ret = MdbOptimization(mdbFolder, mdbName)
If ret = True Then
Call MsgBox("最適化が終了しました。", vbInformation + vbOKOnly, "メッセージ")
Else
Call MsgBox("最適化中にエラーが発生しました。", vbExclamation + vbOKOnly, "メッセージ")
End If
'--------------------------------------------
End Sub

プログラムの実行
※Accessデータベースの元ファイル

①データベースを別名で最適化

②元データベースを別名でバックアップ(上書きコピー)

③最適化したデータベースを元名で上書きコピー
※上の画像のファイルサイズを見るとわかりますよ

④ ①のファイルを削除

★★★最適化の終了です★★★パチパチパチパチ
コメント