アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

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

A 回答 (3件)

「入力インターフェイスにExcel」


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

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

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

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

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

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

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

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

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


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

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

ありがとうございます.チェックは外して,手動最適化にします.

お礼日時:2012/08/23 21:09

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



> ただ,学期末処理をする際にExcelからAccessアプリケーションを呼び出してある資料をレポート出力します.

CreateObject で Access を起動し、
OpenCurrentDatabase で accdb を開いてレポートを印刷する、
ということなら 最適化されます。

簡単なテストで確認できます。
参考まで。

オートナンバー型のフィールドを含む 「テーブル1」 を作成し、
データを数件入力します。
全件削除し、
再び入力し、オートナンバーが削除前の続きになることを確認します。
さらに数件入力してデータベースを閉じます。

Excel VBA で、次のコードを実行します。

Sub test()
  Dim appAcc As Object
  Dim strSQL As String

  Set appAcc = CreateObject("Access.Application")
  appAcc.OpenCurrentDatabase ThisWorkbook.Path & "\Sample.accdb"

  appAcc.Visible = True

  strSQL = "DELETE FROM テーブル1"
  appAcc.DoCmd.RunSQL strSQL

  appAcc.Quit
End Sub

Sample.accdb に テーブル1 があり
同じフォルダに Excel ファイルがある場合の例です。
環境にあわせて書き換えてください。

実行後に DB を開き、
テーブル1 のデータが削除されていることを確認、
データを入力すると、オートナンバーが リセットされていることが確認できます。
これは 「最適化」 の効果によるものです。
    • good
    • 0
この回答へのお礼

ありがとうございます.

お礼日時:2012/08/23 21:10

>accdbファイルをAccessアプリケーションで開いてオプションで


>「閉じるときに最適化する」にチェックしておけば,
>ExcelVBAからaccdbファイルを開いて閉じたときに自動的に最適化されるのですか?

ADOで接続して・・でしたら最適化は行われません。絶対に。
最適化を行っているのはMSACCESS.EXEです。
ExcelからADOで接続しているだけでしたらAccessは蚊帳の外です。

Access がインストールされているのなら、
起動オプションの Compact で済ませる手もあるかも知れません。
http://office.microsoft.com/ja-jp/access-help/HA …
の最後の方。
    • good
    • 0
この回答へのお礼

ありがとうございます.

お礼日時:2012/08/23 21:10

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

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