| |
伝言板にもたびたび出てきますが、なんで皆さんそんなに最適化をやりたがるんでしょう?
メニューバーから「最適化」を選択するだけですぐ出来るのに!
そりゃ、自分で作ったアプリケーションを人に渡す場合、自動的に最適化できるのが理想かも知れないけど、「最適化をやって下さい!」って書いとくだけで十分じゃないの?
とにかく「ホントにバカバカしいなー!」と思いながらこのユニットを作りました。
何をするものか?
MicrosoftAccessのmdbデータベースを開いている時に、任意の場所、任意のスクリプト中から最適化を行えるようなシステムを組込むユニットです。
|
| |
最適化の方法の種類
- CompactDatabaseメソッド
- スクリプトから行う場合別名で最適化して保存してからNew.mdbを元の名称に書きかえる方法をとります。
Access97アプリケーション開発ガイドP458,
15.5.1データベースの最適化 参照
しかしこの方法ではそのとき現在Accessウインドウで開いているmdbの名前を変更する事は不可能なので結局自分自身の最適化は出来ません。
マクロ → コマンドの実行 → データベースの最適化
も同様です。
-
- SendKeysを使う
- メニューバーから手動で行うごく普通の方法、
ツール → データベースユティリティー → 最適化
をSendKeysで行う一番手っ取り早い方法ですが、Access97が最新版である現在、SendKeysにはバグが有るので使う事は危険で、1回だけのSendkeysコマンドに全ての処理手順を書いて実行してしまえば外見上成功したように見えますが、潜在的ダメージをAccessまたはWindowsに残す事が経験上分っています。
-
- 正攻法でスクリプトから行う
- これはメニューバーでやっている方法をそっくりそのままVBAスクリプトでやる方法で、もしこれが出来れば一番良い訳です。
つまりAccessウインドウは閉じないで現在のデータベースだけを閉じてから最適化を行い、開いたままのAccessウインドウ上にまた同じmdbを開くというもの。
これはリファレンスにも例として記述されており、可能ならば数行のスクリプトを書くだけで自分自身の最適化ができるはずですがうまく行きません。
おそらく多くのプロも成功していなものと思われます。
-
- コマンドラインから行う
- これはもちろんmdbが閉じている状態から行うわけです。
ショートカットのコマンドラインに
C:\MSOffice\MSACCESS.EXE
C:\Data\table.mdb /COMPACT
のように記述して最適化だけを行う方法、または「BeforPower Off」のようなソフトを利用してWindowsの終了直前に最適化をやらせて自動的にコンピュータのスイッチOffを行うなどの方法が考えられます。
応用になるけれど、上記コマンドライン指定でマクロの「アプリケーションの実行」を行っても閉じているmdbの(自分自身は不可)最適化は可能です。
-
- Pension萩方式
- Shell関数を駆使して最適化実行用別mdbを開いてから自分自身を閉じ、Shell関数をコマンドライン付で実行する事により最適化し、最適化を完了した元のmdbを開いて飛び移るという方法です。
最適化実行用別mdbにはAutoExecマクロを仕込んでおき、開くと同時に自動処理を開始させる所がミソ!
正攻法では無いけれども処理は割とスムーズに行われます。
開いている自分自身から任意の時に任意の条件を付けて自作関数で最適化が行えるので、現時点では最良の方法じゃないでしょうか。
|
| |
試用方法
- 何か適当に大きなテーブル等をインポートしてから削除し、エクスプローラでmdbサイズが大きくなった事を確かめる。
- サンプルフォームのボタンを押して最適化を行い、またエクスプローラでサイズが小さくなっている事が確認できれば成功!
(注)
スペースを含むmdbファイル名の場合は処理できません。
|
| |
組込み法
- 必要ファイルのインポート
- saiteki.mdbの中の
マクロ------最適化Temp
モジュール--最適化Temp, 最適化DB
組込もうとするmdbに上記3ファイルをインポートします。
saiteki.mdbを同一ホルダーに置いてサンプルフォーム下端のコンボから組込もうとするmdbを選択する事により自動エクスポートができます。
- 起動設定
- マクロ Sample
に有るように最適化を起動したい場所に関数名 最適化() を記述するだけです。
プロシジャーの中から呼び出す場合は 最適化 と書くだけでカッコは付けません。
Sampleでは分りやすいように、フォーム上のボタンからマクロでプロシジャーの実行を行っています。
- 後処理
- 仮の最適化実効用mdbが作られるのでAutoExecマクロで KillTempMDB() を実行して削除します。
既存のAutoExecが有る場合はそのトップに設定、起動時の設定で何か指定している場合はAutoExecで行うように変更して下さい。
|
| |
saiteki.mdbのファイル構成
サンプル専用ファイル
- フォーム Sample
最適化実行ボタンを配したフォームサンプル
組込み用エクスポートセットも配置
- マクロ AutoExec
最適化実行後の再オープン時に KillTempMDB() を実行して仮mdbの削除を行うサンプル
- マクロ Sample
最適化実行ボタンのイベントで 最適化() を実行するサンプル
- モジュール mdbList
フォームSample上に配した同一ファイル内のmdbを表示するコンボボックスのソース用ユーザー定義関数
実行に必要なファイル
- マクロ 最適化Temp
実行用仮mdbにAutoExecに改名して送り込まれ、モジュール最適化Temp内の最適化Module()を実行する。
- モジュール 最適化Temp
実行用仮mdbに送り込まれ最適化Module()を実行する。
- モジュール 最適化DB
最適化()で実行用仮mdbを作成し必要ファイルを送りこむ。
KillTempMDB()は最適化後の実行用仮mdbの削除。
|
| |
原理
原理は実に簡単で、最適化実行用mdbを開いて自分自身は閉じてしまう。
すると最適化実行用mdbに仕込んであるAutoExecが働いて自動実行を始めるのでまるで別のmdbに飛び移ったように見える。
飛び移った先が別のmdbであり、元mdbは閉じているのだから元mdbの最適化が実行可能なのだ。
最適化が終わったら同じ要領で最適化を終了した元mdbを起動して飛び移り、AutoExecで仮mdbは削除してしまう。

改造
スペースを含んだmdb名からは使えない、という所にちょっと引っかかりますね!
どうしても嫌な人は・・・・
関数最適化Module()の最後の方、
RetVal = Shell(AccDir
& " " & mdb_compact & " /Compact",
3)
でやっている最適化の実行を
Access97アプリケーション開発ガイドP458,
15.5.1データベースの最適化
通りの方法に書き換え
元mdbの再呼び出し
RetVal = Shell(AccDir
& " " & mdb_compact, 1)
を別の方法、例えば
Set appAccess
= CreateObject("Access.Application.8")
'
データベースを Access
ウィンドウで開きます。
appAccess.OpenCurrentDatabase strDB |
等の方法で行えばOKだと思います。
とにかくコマンドラインを使う方法ではファイル名の中のスペースがコマンドラインの区切りマークのスペースと誤判断されるのが原因ですから、コマンドラインを使わない方法にすれば良いんです。
|