• ベストアンサー

Accessデータベースの最適化をExcelVBAでやりたい

 レコードの追加・削除を繰り返して重たくなったAccessデータベースを軽くするために、手作業で「ツール→データベースユーティリティ→最適化」とやっているのですが、これをExcelVBAで自動化したいのです。  ADOのコマンドでできるのでは?と勝手に考えているのですが、どうなんでしょうか?  ExcelVBAから可能でしたら、どのように書けばよいか教えてください。  なお、ADOの知識は非常に乏しいのですが、「ConnectionオブジェクトやRecordsetオブジェクトを定義して、レコードの追加・削除を行う」程度なら分かります。(逆に言うとそれくらいしか分かりません…)  平易な言葉でお教えいただけると助かります。よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

ExcelでACCESSのライブラリを参照させます。 その上で以下のコードを実行してみてください。 ただし詳細設定は未確認です。とりあえず最適化はできてます。 (WinME+Office2000の場合) C:\DB1.mdb を C:\DB1_2.MDBにします。 1.ExcelVBAのメニュー[ツール]-[参照設定]をクリック。 2.[Microsoft Access 9.0 ObjectLibrary]にチェックを付ける。 3.以下のコードを貼り付けて実行。 Sub ACCESSの最適化() Dim mdbSourceDB As String Dim mdbTargetDB As String '最適化対象のデータベースファイル mdbSourceDB = "C:\db1" '最適化後のデータベースファイル mdbTargetDB = "C:\db1_2" '最適化を実行する DBEngine.CompactDatabase mdbSourceDB, mdbTargetDB End Sub これでとりあえずは最適化できますがチューニングはがんばって見てください。

takaandhiro
質問者

お礼

 早速のご回答ありがとうございました。試してみましたら、うまくいきました。  この場で申し訳ありませんが、もう一つ質問させてください。  上記の回答では、最適化の前後でデータベースファイル名を変えなければならないと思うんですが、ファイル名を変えなくても良い方法があったらお教えいただけないでしょうか。  「そんな方法は無い!」ということでしたら、その旨をお返事いただければ幸いです。よろしくお願いします。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 つけたし程度ですが。 手順としては以下のような感じでしょうか。 Accessファイルを"db1.mdb"として、別に"temp.mdb"というファイル名を使用します。 1.temp.mdbファイルを削除する 2.Nameメソッドで、db1.mdb→temp.mdbに変名する 3.temp.mdb→db1.mdbに最適化する 4.次回最適化まで、temp.mdbはバックアップとして保存しておく temp.mdbファイルは、最適化直後に削除してもいいんですが、タイミングによっては最適化中に削除を実行してしまい、エラーになってしまう可能性があるので、次回最適化直前がいいと思います。 あと、Accessのオプション設定で、「閉じる前に最適化する」という項目があるので、それをチェックしておき、いったん開いてすぐ閉じるという動作をすれば出来ます。 この場合は同じファイル名で最適化されます。 ちなみに、ファイルを開くには、Shell関数や、APIのShellExeCute関数を使用します。 閉じる場合は、自動化しようとするとちょっと面倒になりますが。

takaandhiro
質問者

お礼

なるほど。 確かにバックアップファイルとして残すというのは、いい作戦ですね。 ファイルを開く2つの関数は知らなかったです。 ありがとうございました。 またよろしくお願いします。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

> ファイル名を変えなくても良い方法があったら 多分、無いと思います。 最適化後のデータベースファイルを削除しておいてから実行する、とかしかないのでは、と思います。 ごめんなさい。

takaandhiro
質問者

お礼

とんでもないです。 非常に助かりました。 またお願いいたします。

関連するQ&A

  • ExcelVBAからAccessにアクセスする

    ExcelVBAからパスワード付きAccessにアクセスする ExcelVBAからADOでAccessに次のようにしてアクセスしています。 Dim Cnn As ADODB.Connection Set Cnn = New ADODB.Connection Cnn.ConnectionString = \"Provider=Microsoft.Jet.OLEDB.4.0;\" _ & \"Data Source=\" & mdbのフルパス Cnn.Open パスワード付きのmdbにアクセスするのはどのようにしたらよろしいでしょうか?

  • Recordsetオブジェクトに取り込んだレコードの件数の数え方

    ExcelVBAでAccessのデータベース操作を行っています。 Recordsetオブジェクトに取り込んだレコードの件数を数えたいのですが、 VBAでどのように書いたらよいのでしょうか。 フィールド数の場合は(myRecSet:Recordsetオブジェクトの変数)、 myRecSet.Fields.Count ' のように書けばことはわかるのですが。 よろしくお願いします。

  • ACCESSのデータベースについて

    今回初めて質問します。 仕事で質問されたことがどうしてもわからないので質問します。 ある顧客のデータがACCESSでデータベース化されていて、 そのデータベースを東京にある本社のサーバにおいて地方にある支社から、 ACCESSで作ったフォームを使ってインターネット経由でDBの参照とレコードの更新、追加をするにはどのような方法があるのでしょうか? 今まで私なりに調べてみましたが"MYSQL"とか"ADO"を使うとかありましたが、 どの方法がよいのかわかりません。 何かいい方法があれば教えてください。 よろしくお願いいたします。

  • Accessのデータベースが開かなくなりました

    初めて質問させていただきます。 いつものようにアクセスを使って名簿を整理していたのですが、「認識しません」というエラーメッセージが出てファイルが開かなくなりました。 ファイルを開こうとすると「このデータベースは予期しない状態のため開くことができません」と出ます。 その下に「このデータベースはツールメニューのデータベースユーティリティーの変換コマンドではなくDAOのCompactDatebaseメソッドを使って以前のバージョンの形式から変換されています。このため、データベース一部が変換されていません。」と表示されます。「元のデータベースがある場合はデータベースユーティリティーの変換をクリックして、変換してくださいとありますができません。 データベースは97で作成したものを2003で使っていました。 何か解決策はあるのでしょうか?

  • 複数のデータベースを検索したい

    困っている内容ですが、 別々のサーバに構築されたAとBというデータベースがあります。 そのAとBにADOによる接続を行いますが、 AとBのテーブルを結合して情報を取得したいと考えています。 SQL文で言うと、 顧客情報はデータベースAに 顧客詳細はデータベースBに存在するテーブルであり 会員IDはそれぞれのテーブルにある SELECT * FROM 顧客詳細 INNER JOIN 顧客情報 ON 顧客情報.会員ID = 顧客詳細.会員ID のようなことがしたいのです。 テーブルを読み込む場合 '' ADO接続オブジェクト Dim adoCon As ADODB.Connection '' 新しいADOレコードセットオブジェクトを作成する Set rs = New ADODB.Recordset '' 読み取り専用でテーブルを開く rs.Open SQL, adoCon, adOpenForwardOnly, adLockReadOnly と書いていまして、adoConの部分が1つのADO接続オブジェクトしか設定できません。 どうにかして2つのデータベースをまたがって 結合できないものでしょうか? 環境は Win2000 + VB6 + SQLSERVER2000 です。 DB初心者なので、説明がうまくいかないと思いますが、 もしおわかりの方がいましたらよろしくお願いします。

  • データーベースへの入力

    こんにちは! 又、質問させて下さい。 ADOを使用してAccessデータベースに入力を行うプログラムについて ですが、 データベースをADODO.Connectionで開き、 レコードセットをコンボボックス参照用、 データ入力用 と二つ使用しているのですが、データ入力用に データを入れて更新しようとするとこのデータベースは読み取り 専用ですと表示されうまく行きません。 (レコードセットのロック処理は問題無いです。) 参照用と入力用はAccessデータベースでは違うテーブルです。 データベース接続一つにレコードセット二つ使用しているから ダメなのでしょうか? こういったプログラムを組んだ経験のある方、教えて下さい。

  • ACCESSデータベース

    ACCESSデータベースで、ユーザーにデータベースの最適化、バックアップをとらせるためにはどうしたらよいですか? データベースではレコードの削除、作成が多く、容量がどんどん大きくなってしまいます。最適化、バックアップをユーザー自身でできれば…と思いますが、皆さんはどのようにしていますか?

  • アクセスでデータベースファイルが開けなくなってしまいました。

    アクセスファイルを開こうとしたら「修復の必要性があるか、もしくはデータベースファイルではありません。」というようなメッセージが出てきました。 そこでツールからデータベースユーティリティを選び、最適化/修復を行ったら所、「修復できません。データベースファイルではありません。」と出てしまいます。 こうなると完全にアクセスファイルは開けなくなるのでしょうか? もしも改善策があるようでしたら教えて下さい。 宜しくお願いします。

  • ExcelVBAでMySQLのAUTO_INCREMETを

    まず、MySQLで作ったデータベースにAUTO_INCREMETに設定したフィールドがあります。 そして、ExcelVBAのADOで新しいレコードを追加した直後にそのフィールドの値 を取得しようとしています。 レコードセット.addNew レコードセット.update レコードセット.MoveLast としても、取得できるのは更新前の値です。 開くときはadOpenDynamic, adLockOptimisticにしているのですが、 他に何か問題があるのでしょうか? ちなみに、一旦closeした後は新しい値が取得できます。

    • ベストアンサー
    • MySQL
  • SQLserverやOracleなどの導入費用

     システムやデータベースに詳しくなく、ExcelVBAを多少使えるといった程度のレベルの者です。誤った表現等があるかと思いますが、ご容赦ください。  OracleやSQLserverといったデータベースを導入し、できればExcelVBAとADOにより、レコードの抽出や追加、削除等の処理を行いたいと考えています。  費用的にはどの程度かかるのかを当社に出入りしているシステム会社に聞いたところ(私が聞いた訳ではないのですが)、「1千万円まではいかないと思うけど…」といった返事だったようです。私は以前、“教えてgoo”で、「SQLserverならクライアント5台で15万円くらい」ということを聞いていたので、予想外の金額の大きさに驚いてしまいました。  小さな会社なので、システムやデータベース等に詳しい人がいないため、当社とシステム会社の間で、「データベースを導入してやりたいこと」に対する認識が大きく違っていた可能性もありますが、実際にそんなにお金がかかるものなのでしょうか。  実際にやりたいことは、ExcelVBAとADOにより、社内LAN上にあるデータベースとExcelとの間でレコードの抽出や追加・削除を行うといったレベルなのですが・・・。「それぐらいのことであれば、~円くらいでできるはずだよ」なんてことも分かれば有難いです。  よろしくおねがいします。