痔になりやすい生活習慣とは?

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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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

これでとりあえずは最適化できますがチューニングはがんばって見てください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/05 00:06

こんにちは。

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関数を使用します。
閉じる場合は、自動化しようとするとちょっと面倒になりますが。
    • good
    • 1
この回答へのお礼

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

お礼日時:2003/01/08 07:33

> ファイル名を変えなくても良い方法があったら


多分、無いと思います。
最適化後のデータベースファイルを削除しておいてから実行する、とかしかないのでは、と思います。
ごめんなさい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/01/08 07:32

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qデータベースの最適化をマクロでしたい

お世話になります。

Accessのマクロのコマンドで
データベースの最適化をしたいのですが、
「マクロまたはVisual Basicコードの実行中に、開いているデータベースを最適化することはできません。」とういうエラーメッセージが出て最適化されません。

マクロの一連の流れの最後で、データベースの最適化をしたいと
思っていますが、具体的にどのようにすれば、
データベースの最適化を実行できるのでしょうか?
※直前に「データベースを閉じる」的な物をいれられるのでしょうか?

素人で大変申し訳ございませんが、具体的に教えて頂ければ助かります。

Aベストアンサー

> マクロの一連の流れの最後で、データベースの最適化をしたいと
> 思っていますが、具体的にどのようにすれば、
> データベースの最適化を実行できるのでしょうか?

一連のマクロの最後に最適化するということなら可能だと思いますが、
一連の流れの途中に入れるは原理的に不可能だと思います。
最適化はいったんデータベースファイルを閉じますので。


方法は下記を参照ください。

Access2003以前の場合
開いているデータベースを最適化する(Access VBA)
http://www.ka-net.org/office/of05.html

Access2007
開いているデータベースを最適化する(Access 2007 VBA)
http://www.ka-net.org/office/of06.html

VBAになりますので、上記の Sub を Function に書き換えて、マクロの「プロシージャの実行」で呼び出します。

Qaccdbファイルの最適化

accdbファイルを成績データベースとして,入力インターフェイスにExcelをもちいてデータベースシステムを運用しています.

ユーザーがaccdbファイルに接続する時間は1秒未満になるようにしたり,ユーザーがデータベースに書き込みするときは排他接続するなどして,複数ユーザーが直列処理になるようにしています.これで同時利用者が数十名でもファイルは壊れませんでした.

ですが,ファイルが肥大化して,年度初め10MBだったのが学期末には40M近くになっていました.バックアップ世代をとっていることもあり,ちょっと困るなと思い,手動でAccessアプリケーションによる最適化を行いました.

システムはADOで作っているので各ユーザーの入力作業ではAccessアプリケーションは基本的に使いません.ただ,学期末処理をする際にExcelからAccessアプリケーションを呼び出してある資料をレポート出力します.

そこで質問です.accdbファイルをAccessアプリケーションで開いてオプションで「閉じるときに最適化する」にチェックしておけば,ExcelVBAからaccdbファイルを開いて閉じたときに自動的に最適化されるのですか.

accdbファイルを成績データベースとして,入力インターフェイスにExcelをもちいてデータベースシステムを運用しています.

ユーザーがaccdbファイルに接続する時間は1秒未満になるようにしたり,ユーザーがデータベースに書き込みするときは排他接続するなどして,複数ユーザーが直列処理になるようにしています.これで同時利用者が数十名でもファイルは壊れませんでした.

ですが,ファイルが肥大化して,年度初め10MBだったのが学期末には40M近くになっていました.バックアップ世代をとっていることもあり,...続きを読む

Aベストアンサー

「入力インターフェイスにExcel」
「同時利用者が数十名」
「ADO」で接続してデータ操作
「閉じるときに最適化する」にチェックしておいて、
「ExcelからAccessアプリケーションを呼び出してある資料をレポート出力」

という運用を考えているのですね。

No1、No2の回答でも言われてますが、ADOで接続して接続を閉じただけでは最適化されませんし、CreateObject で Access を起動しているのなら、Accessオブジェクトを閉じた時に最適化されます。

ただし、このような運用は、非常に危険だと思います。

例えば、誰かが ADOで接続してデータ操作しているときに、別のユーザーがレポートを印刷して閉じて最適化されたら、どうなるのか。
あるいは、二人がほとんど同時にレポートを開き印刷後閉じて、同時に最適化が始まったら、どうなるのか。

accdbファイルが破損する危険性が非常に高い運用だと思います。
最適化に失敗してデータファイルが消滅したという報告をまれにWEBでみることもあります。
レポートを印刷するたびに最適化を繰り返すというのはやはり破損の危険性を高めます。

No1の回答で紹介されているリンク先
http://office.microsoft.com/ja-jp/access-help/HA010341740.aspx
でも、

> ネットワーク上で複数のユーザーが単一のデータベース ファイルを共有する場合を除き、最適化と修復を自動で行うようにデータベースを設定します。

というようにファイルを共有している場合は、最適化を自動で行うのは推奨していません。


accdbファイルを置いているサーバーが常時電源オンになっているなら、深夜など誰も使用していない時に、あるいは毎朝、電源を入れるならPC起動時に、自動で最適化するようにするのがいいかと思います。
安全性を重視するなら、バックアップをとってから最適化するようにするのがよりいいでしょう。Accessにおいては定期的なバックアップは必須です。

具体的な方法としては、Windowsのタスクで、上記のリンク先の最適化ショートカットのコマンドを実行させるようにします。

「入力インターフェイスにExcel」
「同時利用者が数十名」
「ADO」で接続してデータ操作
「閉じるときに最適化する」にチェックしておいて、
「ExcelからAccessアプリケーションを呼び出してある資料をレポート出力」

という運用を考えているのですね。

No1、No2の回答でも言われてますが、ADOで接続して接続を閉じただけでは最適化されませんし、CreateObject で Access を起動しているのなら、Accessオブジェクトを閉じた時に最適化されます。

ただし、このような運用は、非常に危険だと思います。

例えば、...続きを読む

QAccessのMDBファイルを自動で最適化する方法

ACCESSで作成したMDBを自動で最適化する方法をご存知方いましたら教えて下さい。
自動で最適化といっても、例えばコマンドラインから対象MDBを最適化できる方法などでも結構です。

理想としては、対象MDBを最適化するBATを作成し、それをタスクのスケジューリングできたらいいなと思っています。

なにか良いヒントでも結構ですので宜しくお願いします。

Aベストアンサー

コマンドライン
msaccess.exe 最適化MDBファイルパス/compact [最適化後MDBファイルパス]

#MSAccessバージョンくらいは明記して欲しいところですね。

QAccess、マクロの最後に最適化を入れられる?

Access2003を使用しています。
マクロの最後に最適化を組み込むことは可能でしょうか?

マクロの内容は、
1、昨日のデータ抽出に使用した作業用テーブル内のデータを削除する
2、本日のデータをインポートしてくる
3、1で空にしたテーブルに、2のデータを追加クエリで流し込む
4、2でインポートしてきたデータ(テーブル)を削除する
です。
この後、「5、データベースを最適化する」を入れてマクロを終わらせたいのです。

インポートしてくるテーブルは8個あり、1テーブルに20万を超すデータが入っているため、インポート、追加をやっているうちに、データベースの大きさが1,126,528KBにもなってしまいます。
この後、この大容量のテーブルを使って、大容量のテーブルを作成しているうちに・・・・データベースは更に大きくなってしまい困っています。
マクロの最後に「ここで一旦最適化」を入れられないでしょうか?

このデータベースを使用するのは自分で使用するものでないため、「マクロ終了後ツールボタンで最適化する」ということが出来ません。
また、VBAはわからないので・・・出来ればマクロなどで対応できると助かります。
どなたか詳しい方、教えてください!

Access2003を使用しています。
マクロの最後に最適化を組み込むことは可能でしょうか?

マクロの内容は、
1、昨日のデータ抽出に使用した作業用テーブル内のデータを削除する
2、本日のデータをインポートしてくる
3、1で空にしたテーブルに、2のデータを追加クエリで流し込む
4、2でインポートしてきたデータ(テーブル)を削除する
です。
この後、「5、データベースを最適化する」を入れてマクロを終わらせたいのです。

インポートしてくるテーブルは8個あり、1テーブルに20万を超すデータが入っ...続きを読む

Aベストアンサー

ここら辺が参考になるかな? いずれにせよ「要VBA」です。
http://www.nurs.or.jp/~ppoy/access/access/acM018.html
http://www.ka-net.org/office.html

Access2007にすると動かなくなることもあるので、コードの
組み方には注意が必要です。手動でやる方が正解なように
私は思いますけど・・・。

QAccess データベースの最適化をマクロでしたい

お世話になります。

Access2000のマクロコマンドで
データベース最適化をしたいのですが、
「マクロまたはVisual Basicコードの実行中に、開いているデータベースを最適化することはできません。」とういうエラーメッセージが出て最適化できませんでした。

マクロの一連の流れの「最後」で、データベース最適化をしたいと
思っていますが、具体的にどのようにすればよいのでしょうか?

最適化をVBAなどでするのではなく、
 マクロのコマンド:データベースの最適化
でしたいと思っております。


過去の質問で、mdb自身が開いているので絶対に無理!!
と言われたのですが、いまいち信じられません。

・私が求める回答は、VBA・プロシージャは使用しない
・マクロコマンドのデータベースの最適化を使用
・マクロの流れの一部で実行
・具体的手順を記載できる人のみ回答をお願いします。


何度か同様の投稿をしましたので、ユーザーから迷惑!と言われていますので
 もうこれ以上同様の投稿はしたくありません。
この質問が迷惑と思われている方は、回答しなければ
 これ以上質問はしませんので、無視お願いします。


ひつこいですが、
・マクロコマンド:最適化を使用した具体的手順を記載できる人のみ回答をお願いします。

宜しくお願いします。

お世話になります。

Access2000のマクロコマンドで
データベース最適化をしたいのですが、
「マクロまたはVisual Basicコードの実行中に、開いているデータベースを最適化することはできません。」とういうエラーメッセージが出て最適化できませんでした。

マクロの一連の流れの「最後」で、データベース最適化をしたいと
思っていますが、具体的にどのようにすればよいのでしょうか?

最適化をVBAなどでするのではなく、
 マクロのコマンド:データベースの最適化
でしたいと思っております。


過去の質問で...続きを読む

Aベストアンサー

No2です

蛇足ではありますが、示したページにはボタンで実行するように説明さてれてますが、アクション名:キー送信、キー操作:%TDCをご自身のマクロの最後に付け足すということで実行してください。

もちろん、ページのように最適化マクロという名前にしてご自身のマクロから「マクロの実行」「最適化マクロ」で実行させてもよろしいでしょう。

ただし、ページに書かれている注意事項は確認しておいてください。

QバッチでAccessのmdbファイルを修復・最適化したい

AccessのMDBファイルは使用頻度が多くなるにつれてデータファイルサイズが肥大化していきます。
ツールメニューのデータベースユーティリティから修復・最適化することも可能ですが、同様の処理をWSHでバッチ処理したいです。

処理の方法をご存知の方、HELPください。

Aベストアンサー

お望みの方法とちょっと違うかもしれませんが、
http://oshiete1.goo.ne.jp/kotaeru.php3?q=437242
http://oshiete1.goo.ne.jp/kotaeru.php3?q=74498

他の端末でMDBファイルを開いている際に最適化をかけようとすると、MDBが壊れそうな気もします。 LDBをチェックするとか、ログインテーブルで管理するとか、何か配慮が必要と思います。 最適化の直前にバックアップを取ることもお忘れなく。 

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QExcel VBAからAccessマクロを実行したい

Excel VBAからAccessマクロを実行する方法を知っている人がいましたら
教えてください。
よろしくおねがいしまっす!

Aベストアンサー

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'マクロの実行
objAccess.DoCmd.RunMacro "メッセージ"

''ACCESSクローズ
objAccess.CloseCurrentDatabase
Set objAccess = Nothing

----------------------------------------------------------------------

もっと良い方法があるのかもしれません

参考にしてみてください。

こんにちは

私もExcelVBAからACCESSのマクロを実行したことはないのですが以下の方法で
一応マクロは実行されました。

----------------------------------------------------------------

DB2.MDBには"メッセージ"というマクロが存在します。
"メッセージ"というマクロはメッセージボックスを表示しています

Dim objAccess As Object

''ACCESSオープン
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase("C:\db2.mdb")

'...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング