- ベストアンサー
Accessの指定時間終了
いつもお世話になってます。 Accessを指定時間に終了できないかと考えております。 現在は、PCをシャットダウンするバッチを作り、タスクスケジュールでシャットダウンしてますが、Accessを起動したまま強制終了します。 出来れば、シャットダウンする前に、データをバックアップ等の処理をいれて終了する事が出来ればと考えております。 もし、Access事態に機能が無いようでしたら、VBScript等でAccessにイベントを送れる等、Access単体で出来なくても結構です。 【環境】 OS:Windows8.1Pro Ver:Access2013
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> タスクスケジューラーで、シャットダウンの時にも、「フォームを閉じる」イベント適用されるのでしょうか? 下記の前提が成立するなら、そうです。 Accessファイルは開いている。 フォームも開いている。(メニューフォームあるいは非表示のフォーム) タスクスケジュラーで定時にPCをシャットダウンする。 つまり、下記のような流れです。 PCをシャットダウンするコマンド → 開いているAccessファイルは閉じられる→開いているフォームは閉じられる→フォームの「閉じる」イベントは実行される > ただ、このDBの場合、フォームを押されたボタンにより条件分岐により行き来します、終了イベントと分ける方法はありませんでしょうか? ちょっと意味がわかりません。もう少し具体的に説明してもらえますか。 > お客様に勝手に操作してもらうため、常時開いているフォームがありません。 それなら、データベースファイルの起動時に非表示のフォームを開いておくようにするといいでしょう。 下記のマクロを作成します。 アクション フォームを開く フォーム名 非表示フォーム ウィンドウモード 非表示 このマクロを AutoExec という名前で保存します。 AutoExecマクロは起動時に実行されますので、起動時に「非表示フォーム」が非表示で開かれます。 このフォームの閉じるときに、バックアップ処理を割り当てれば、Accessファイルを閉じるときに、バックアップ処理が必ず実行されます。 > 1.フォームをタイマープロシージャで定期的に再読み込み > 2.フォームの読み込みイベントに、時間を取得 > 3.2で取得した時間を条件分岐で、終了処理プロシージャーを実行 > こんな感じで良いのでしょうか? Accessの方で定時に実行する場合ですね。 そんな面倒なことをしなくても、上記の非表示フォームのタイマー時イベントで、 時刻判断をして終了処理を実行すればいいだけです。 例えば、午後10時に自動終了する場合、 タイマー間隔は 60000 (60000ミリ秒=1分)に設定しておいて、 Const CloseTime = #10:00:00 PM# Private Sub Form_Timer() If Time >= CloseTime And Time < DateAdd("n", 10, CloseTime) Then Me.TimerInterval = 600000 '終了処理 ElseIf Me.TimerInterval = 600000 Then Me.TimerInterval = 60000 End If End Sub ただし、 ユーザーが自由に操作できるという運用なら、当然ファイルも自由に閉じることができますよね。 ということなら、Accessの方で定時に実行するという処理を組み込んでも無意味のように思います。 定時にAccessが開いている保証はないのですから。 上で説明した非表示フォームの閉じるときに実行する方法にしておけば、もしユーザーが定時前にフォームを閉じたら、その時点でバックアップ処理が実行される。ユーザーがファイルを開いたまま帰宅したら、タスクスケジューラでシャットダウンするときに、やはりバックアップ処理が実行される、というように確実にバックアップが実行されます。 別の方法としては、バックアップ処理専用のファイルを作成しておいて、タスクスケジュラーでそのファイルを起動するようにするという方法もあります。 バックアップ処理専用のファイルはAutoExecマクロから終了処理プロシージャーを実行して、処理終了後ファイルを閉じるようにしておけばいいでしょう。
その他の回答 (3)
- hatena1989
- ベストアンサー率87% (378/433)
> 手動で閉じるときの処理については、問題なく書けると思うのですが、毎日定時に自動で終了するするように出来ればと考えております。 > 現在は、PCをシャットダウンするバッチを作り、タスクスケジュールでシャットダウンしてますが、Accessを起動したまま強制終了します。 タスクスケジューラーでシャットダウンするときに、Access も閉じられますよね。その時に、フォームの閉じるときのバックアップ処理も実行されます。 それで問題無いと思いますが。 タスクスケジューラーに関係なくAccessだけで定時に実行させたいなら、常時開いているフォームのタイマー時のイベントで自動実行すればいいでしょう。その場合は、下記を参考にしてください。 タイマ時イベントで時刻判断するときの注意点 - hatena chips http://hatenachips.blog34.fc2.com/blog-entry-269.html
お礼
hatena1989様 度々の回答有難うございます。 すいません、いくつか確認させてください。 【質問1】 >タスクスケジューラーでシャットダウンするときに、Access も閉じられますよね。その時に、フォームの閉じるときのバックアップ処理も実行されます。 タスクスケジューラーで、シャットダウンの時にも、「フォームを閉じる」イベント適用されるのでしょうか? ただ、このDBの場合、フォームを押されたボタンにより条件分岐により行き来します、終了イベントと分ける方法はありませんでしょうか? 【質問2】 「タイマ時イベントで時刻判断するときの注意点 - hatena chips」参考URLを拝見したのですが、お客様に勝手に操作してもらうため、常時開いているフォームがありません。 ということは、すべてのフォームにプロシージャーを作成すれば、良いという事でしょうか? 処理として 1.フォームをタイマープロシージャで定期的に再読み込み 2.フォームの読み込みイベントに、時間を取得 3.2で取得した時間を条件分岐で、終了処理プロシージャーを実行 こんな感じで良いのでしょうか? 重ね重ねの質問で、お手数をおかけし申し訳ありませんが、アドバイス頂けましたら幸いです。
- Anzu4699
- ベストアンサー率59% (26/44)
自分が以前やったことがある手法は以下の通り 環境(バージョン等)が違うので、ご参考程度に乗せときます O S:Windows7 Ver:Access2007 「バックアップ」と「終了」を組み込んだマクロを用意しておき (M_BackUpEnd)、そのマクロをバッチで実行しています ※バッチにさえなれば、タスクスケジュラー等で管理しやすいんで --- TaskSCR_AcsEnd.bat内構文 --- 1行目:"C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE" "C:\temp\SMP04\ImgDownloder.accdb" /x M_BackUpEnd 2行目:exit 以上でした
お礼
Anzu4699様 回答有難うございます。 まさに私が希望していた回答だと思いますが、下記を実行すると新Accessが起動しマクロが実行されます。 参考バッチの内容として、私が推測したのですが。 "C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE" →アクセスのプログラムファイル "C:\temp\SMP04\ImgDownloder.accdb" → AccessのDBフルパス 【acend.bat】 @ECHO OFF REM kcal2終了バッチ "C:\Program Files\Microsoft Office\Office14\msaccess.exe" "c:\db\test.accdb" /x msg ECHO ON EXIT 【マクロ:msg】 アクション:Accessの終了 オプション:すべて保存 起動している、Accessを終了させるにはどうしたらよいか、アドバイス頂けましたら幸いです。
- hatena1989
- ベストアンサー率87% (378/433)
Accessのファイルを閉じるときに、バックアップ処理を実行したいということでしょうか。 Accessファイルが開いている時に常に表示されているメニューフォームのようなものがあれば、そのフォームの「閉じるとき」イベントでバックアップ処理を実行するようにすればいいでしょう。 常に開いているフォームがないなら、ファイルの起動時に非表示のフォームの開くようにして、そのフォームの閉じるときにバックアップ処理を実行するようにすればいいでしょう。
お礼
hatena1989様 回答ありがとうございます。 手動で閉じるときの処理については、問題なく書けると思うのですが、毎日定時に自動で終了するするように出来ればと考えております。 ただ、Accessには時間処理の概念が無いのではと思い、質問させて頂きました。
お礼
hatena1989様 度々、厚かましいお願いにご回答頂き有難うございます。 サンプルVBAまでご提示いただき有難うございます。 後者のVBAで処理できるよう、試してみます。 ちなみに、アクセスは勝手に終了出来ないように、すべてのフォームを全画面表示にし、最小化・閉じるボタンを禁止してます。 とはいっても、タスクマネージャー開かれたら停止できますが。。。 なんとなく、実装できそうな感じがしましたので、あとは自分なりにテストしてみたいと思います。 厚かましいお願いにお付き合い頂き有難うございました。