[[20090924233610]] 『時間で保存』(みさき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『時間で保存』(みさき)

質問させてください。まずブックを開きます。そこでこのブックを保存したいのですが
この保存方法で5分たった時点で自動で保存してブックを閉じる方法を教えてください。
宜しくお願いします。


 VBAのApplication.OnTimeメソッドを使えば出来ると思います。
 問題は、5分後の時刻をどこに保存して置くかですが・・・・
 (5分前にオペレータがブックを閉じた時にOntimeメソッドの取消しを行なう時に必要)。
 変数だとシートをユーザーに触らせると簡単に値が消えてしまう可能性がありますからねえ!!
 どこかのセルに入れておくか・・・、さてどうしよう・・・。
 ユーザー設定のドキュメント プロパティに保存するようにしました。

 当該ブックのThisworkbookのモジュールに

 Option Explicit
 '====================================================================================
 Const e_tm = "終了時刻"
 '====================================================================================
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.OnTime EarliestTime:=get_cdp(e_tm).Value, Procedure:="thisworkbook.end_proc", Schedule:=False
    On Error GoTo 0
 End Sub
 '====================================================================================
 Private Sub Workbook_Open()
    Dim tm As Date
    tm = Now() + TimeValue("00:05:00")
    If mk_cdp(e_tm, msoPropertyTypeDate, tm) <> 0 Then
       get_cdp(e_tm).Value = tm
    End If
    Application.OnTime EarliestTime:=get_cdp(e_tm).Value, Procedure:="thisworkbook.end_proc"
 End Sub
 '====================================================================================
 Sub end_proc()
    ThisWorkbook.Close True
 End Sub
 '======================================================================
 Function mk_cdp(pnm As Variant, mytype As MsoDocProperties, myvalue)
    On Error Resume Next
    With ThisWorkbook
       .CustomDocumentProperties.Add pnm, False, mytype, myvalue
    End With
    mk_cdp = Err.Number
    On Error GoTo 0
 End Function
 '======================================================================
 Function get_cdp(pnm As String) As DocumentProperty
    Dim cp As DocumentProperty
    Set get_cdp = Nothing
    For Each cp In ThisWorkbook.CustomDocumentProperties
      If cp.Name = pnm Then
          Set get_cdp = cp
          Exit For
          End If
      Next
 End Function

 これで一度保存した後、Excelを終了し、再度当該ブックを開いて試してみてください。

 最初は5分後は長いので上記のコードの

 tm = Now() + TimeValue("00:05:00")

 の箇所を
 tm = Now() + TimeValue("00:00:20")

 ぐらいで試してみてください。

 ichinose


回答有難うございます。うまくブックを閉じる事ができました。しかしグレーの画面になってしまいます。この状態でブックを閉じた事になるのですか?複数のユーザーが同じブックを使用していてブックを開きぱなしにされると使用中読み取りでとなるのを防ぎたいのですがデスクトップの画面でなくても平気なのでしょうか?(みさき)

 >しかしグレーの画面になってしまいます。この状態でブックを閉じた事になるのですか?
 このグレーの画面ってのは、提示したVBAコードを含んだブックが閉じた後、Excel自身が残っていると言うことですよね?
 Excelまで消してしまったら、VBAコードを含んだブックを開いた状態で、別のブックを編集していたら、
 時間が経ったのでExcelまで閉じられてしまった と言うことになってしまいます。
 投稿したVBAコードは、「開いてから5分経ったらそのブックを保存して閉じる」という機能を持ったコードです。
 5分経ったら閉じるのは、VBAコードを含んだブックだけで良いですよね?
 
 こういう理由でExcel自身は、閉じずに残しています。

 >複数のユーザーが同じブックを使用していてブックを開きぱなしにされると使用中読み取りでとなるのを防ぎたいのです
 Excel自身が残っていても対象ブックさえ閉じれば、上記の問題は解決すると思います。 
 が・・・・・。

 現状のVBAコードは、繰り返しますが、
 「開いてから5分経ったらそのブックを保存して閉じる」という機能を持ったコードです。

 ですから、対象ブックを開いて、使用者が入力したり、訂正したりしてこのブックを使っていても
 5分経過すれば、保存はしますが、閉じてしまいます。
 入力している途中で閉じてしまうのですよ!!私なら、「何だよ!!」とPCの前で怒っちゃうかな・・。

 それでもこの仕様でよいと言うなら、現状コードでよいでしょう!!
 でも、ブックを開いてから、5分間編集操作がなかったら、そのブックを保存して閉じる(例) 
 と言うように編集操作があれば、閉じる時間が延長される仕様にするなら、
 コードを変更しなければなりません。

 検討してみてください。

 ichinose


会社で試してみました。全く問題ありませんでした。有難うございました。感謝します。(みさき)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.