VBAでエクセルの自動保存と閉じる機能を実装する方法

このQ&Aのポイント
  • 一定時間経過したら自動でエクセルを保存して閉じる機能をVBAで実装する方法について説明します。
  • エクセルのセルに入力がない時間が一定時間経過すると、自動的にブックを保存し、閉じるようなVBAコードを作成します。
  • この機能を実現するためには、エクセルのマクロ機能であるVBAを使用します。エクセルのVBAエディタを開き、下記のコードを入力します。ただし、保存確認を避けるため、事前にブックを保存しておくことが必要です。このコードを実行すると、エクセルのセルに入力がない時間が一定時間経過すると、自動的にブックを保存し、閉じるような動作が行われます。
回答を見る
  • ベストアンサー

VBA=一定時間エクセルの入力操作がない場合、自動的にそのブックを閉じたい

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。 そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・ 上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょうか? 可能の場合、どのようなVBAになりますか?? よろしくお願いします。 ⇒ 'ブックの上書き保存 ActiveWorkbook.Save ' 保存確認を避けるため、保存済みにする ThisWorkbook.Saved = True ' 他にブックが開いていなければ、Excelを終了する If Workbooks.Count <= 1 Then Application.Quit ' 本ブックをClose ThisWorkbook.Close False

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

何かオペレーションが行われたかを監視して、5分ごとにそれをチェックし、オペレーションがされなかったらブックを閉じるというマクロを組んでみました。(最後のオペレーションから5分間監視、ではなく、ブックを開いてから5分間隔でチェックするので、多少のタイムラグがあります) しかし、「何もしなかったら」というのを検知する方法がわからなかったため、ちょっと強引ですが ThisWorkbook のイベントほとんど全てをを定義して、「何かした」というフラグを立てるという方法になっています。 そのため、ThisWorkbook のイベントで拾えない操作をしたときにも強制終了する可能性があります。 まず、標準モジュールに以下のマクロを貼り付けてください。 "00:05:00"という箇所が「5分」を定義しているところなので、時間間隔を調整したいときはそこをいじってください。 Public Operated As Boolean Sub SetTimer()  Application.OnTime Now + TimeValue("00:05:00"), "CloseMe" End Sub Sub CloseMe()  If Operated Then   Operated = False   SetTimer   Exit Sub  End If    'ブックの上書き保存  ActiveWorkbook.Save  ' 保存確認を避けるため、保存済みにする  ThisWorkbook.Saved = True  ' 他にブックが開いていなければ、Excelを終了する  If Workbooks.Count <= 1 Then Application.Quit  ' 本ブックをClose  ThisWorkbook.Close False End Sub そして、ThisWorkbook に以下のマクロを貼り付けてください。 Private Sub Workbook_Open()  Operated = False  SetTimer End Sub Private Sub Workbook_BeforePrint(Cancel As Boolean)  Operated = True End Sub Private Sub Workbook_Deactivate()  Operated = True End Sub Private Sub Workbook_Activate()  Operated = True End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object)  Operated = True End Sub Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)  Operated = True End Sub Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)  Operated = True End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  Operated = True End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)  Operated = True End Sub Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)  Operated = True End Sub Private Sub Workbook_WindowActivate(ByVal Wn As Window)  Operated = True End Sub Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)  Operated = True End Sub Private Sub Workbook_WindowResize(ByVal Wn As Window)  Operated = True End Sub ご覧の通り、Workbook_Open()だけは初期設定をしていますが、その他は「何かイベントが発生したらフラグをTrueにする」の羅列です。 単にExcelのファイルを開いて、マウスのホイールでスクロールしながらあちこちシートを眺めているだけの場合など、セル操作や印刷などの操作がない場合にも強制終了されてしまうので、そこはご承知ください。

hiyaku
質問者

お礼

早速、ありがとうございます。 会社に行って試してみます。。。 m(__)m 眺めているだけの場合にも閉じられてしまうところが、 ちょっと・・・・検討してみます。。。。

その他の回答 (4)

  • Bickyon
  • ベストアンサー率41% (42/101)
回答No.5

VBAでは、ご希望の機能を完璧に実現するのは困難なような気がします。 どこかでチェック漏れが発生して大事な入力情報を失ってしまうことになるのではないでしょうか。 そこで提案ですが、メニューバーの「ツール」-「ブックの共有」を試してみてはどうでしょうか? この機能はとても便利で、ブックを複数の人が開いて更新することができます。(私はチームの作業進捗管理には必ずこのブック共有を使っています) 自分がブックを更新したいときは、先ず保存ボタンを先にクリックします。そうすると自分がブックを開いた以降に他者が更新した内容が、画面に反映されますし、保存ボタンをクリックせずに他者が更新したセルを更新しようとすると警告してくれます。 更新する前に保存ボタンで表示内容を最新化するのと、入力が終わったら保存ボタンをクリックすることをルール徹底すれば、かなり便利な機能です。 難点としては共有状態のままでは、オートシェイプを更新したり、フィルタの条件を変更できない等ありますが、その際は一時的にブック共有を解除すれば大丈夫です。 一度お試しください。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.4

やっぱりデバッグで止まってしまっていますか…。 ステップ実行させていると書かれていたので私もタイマーを縮めてステップ実行させてみました。その結果、現象は再現しました。私の場合ではステップ実行している間に次のタイマーが来てしまい、ボタンの上にボタンが重ねられて、内部的に不整合が生じてエラーになることがわかりました。多分同じことが起きているのではないかと推測しています。 それで、多分今はブックを開いたときに、はじめからボタンが表示されている状態だと思います。それは前にデバッグして止まったときのボタンの残骸で、それを押すとエラーになります。もしそういう状態なら、ブックを開いてすぐにボタンの「縁」を右クリックして「切り取り」を行ってボタンを削除してください。正常な状態では、ブックを開いたときにはボタンは表示されません。 ひょっとしたら何枚もボタンの残骸が重なっているかもしれないので、上の操作で消してもまだボタンがある場合は、とりあえず全部消してみてください。その上でいったんブックを閉じて、再度開いてみてください。 それで、その後ステップ実行をするとまた同じ現象が発生してしまいます。なので、ステップ実行は行わずにタイマーを縮めてみて様子を見るなど、VBAの実際の実行時間とタイマーの関係が狂わないようにして、動作確認をしてみていただけますか?

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

デバッグで止まってしまいましたか…。いろいろパターンを変えてテストしてみたのですが。 どういう条件の場合にエラーが出るかわかりますか? とりあえず回避策として、 1.   Sub CloseMe()   If AlertButtonPushed Then Exit Sub   AlertButton.Delete   ←←1.ここの部分   'ブックの上書き保存 の部分を、 1.   Sub CloseMe()   If AlertButtonPushed Then Exit Sub   If Not AlertButton Is Nothing Then     AlertButton.Delete   End If   'ブックの上書き保存 に変更して、 2. Sub AlertButton_Click()  AlertButtonPushed = True  AlertButton.Delete     ←←2.ここの部分  SetTimer End Sub の部分を、 Sub AlertButton_Click()  AlertButtonPushed = True  AlertButton.Delete  Set AlertButton = Nothing '←この行を追加  SetTimer End Sub に変更して試していただけますか? あと、ボタンの残骸がシートに残っていたら、右クリック>切り取り で消してください。

hiyaku
質問者

お礼

色々ありがとうございます。 ウーん、何度やっても下記の AlertButton.Delete  のところでデバッグしてしまいます。。。。。。(-_-メ) 「AlertButton」をクリックしてもメッセージが消えませ~ん・・・・ ⇒ Sub AlertButton_Click() AlertButtonPushed = True AlertButton.Delete Set AlertButton = Nothing '←この行を追加 SetTimer End        ←

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

> 眺めているだけの場合にも閉じられてしまうところが、 > ちょっと・・・・検討してみます。。。。 やっぱりそうですよね。しかしながら、ただ眺めているだけでは何もオペレーションしてないのと同じなので、そうなってしまいます。マウスでどこかのセルをクリックしたり矢印キーでセルを移動するだけでいいのですが。 そうは言っても不便だと思ったので、ちょっと改良してみました。 何も操作せずに5分経つと、警告音とともに  5分以上操作がなかったので  30秒後に終了します。  操作を続行したいときは  このボタンを押してください と表示されたボタンをExcelの画面の中央に表示するようにしました。 そのボタンを押せばブックは閉じません。ボタンを押さずに30秒経過すると、自動的にブックを閉じます。エクセルを最小化している場合は、最大化してボタンを表示するようにしています。 標準モジュールのマクロを以下に差し替えてみてください。 5分とか30秒などを調節する場合は、マクロ中の "00:05:00"や"00:00:30"の部分を変えてください。 Public Operated As Boolean Public AlertButton As Object Public AlertButtonPushed As Boolean Sub SetTimer()  Application.OnTime Now + TimeValue("00:05:00"), "ShowAlert" End Sub Sub CloseMe()    If AlertButtonPushed Then Exit Sub    AlertButton.Delete    'ブックの上書き保存  ActiveWorkbook.Save  ' 保存確認を避けるため、保存済みにする  ThisWorkbook.Saved = True  ' 他にブックが開いていなければ、Excelを終了する  If Workbooks.Count <= 1 Then Application.Quit    ' 本ブックをClose  ThisWorkbook.Close False End Sub Sub ShowAlert()  Dim BtnLeft As Double, BtnTop As Double  Dim BtnWidth As Double, BtnHeight As Double    If Operated Then   Operated = False   SetTimer   Exit Sub  End If    If Application.WindowState = xlMinimized Then   Application.WindowState = xlMaximized  End If  AppActivate "Microsoft Excel - " & ThisWorkbook.Name    AlertButtonPushed = False  BtnWidth = 150  BtnHeight = 100  BtnLeft = ActiveWindow.Width / 2 - BtnWidth / 2  BtnTop = ActiveWindow.Height / 2 - BtnHeight  ActiveSheet.Buttons.Add BtnLeft, BtnTop, BtnWidth, BtnHeight  Set AlertButton = ActiveSheet.Buttons(ActiveSheet.Buttons.Count)  AlertButton.OnAction = "AlertButton_Click"  AlertButton.Characters.Text = _  "5分以上操作がなかったので" & vbCrLf & _  "30秒後に終了します。" & vbCrLf & _  "操作を続行したいときは" & vbCrLf & _  "このボタンを押してください"  With AlertButton.Characters.Font   .Name = "MS Pゴシック"   .FontStyle = "標準"   .Size = 9  End With  Beep    Application.OnTime Now + TimeValue("00:00:30"), "CloseMe" End Sub Sub AlertButton_Click()  AlertButtonPushed = True  AlertButton.Delete  SetTimer End Sub

hiyaku
質問者

お礼

色々恐縮です。 早速ですが、標準モジュールのマクロを以下に差し替えてみまして 「ステップイン」を実行してみましたが、下記の2ケ所でデバッグが 表示されてしまいます・・・・・ スミマセンがよろしくご教授お願いします。 1.   Sub CloseMe()   If AlertButtonPushed Then Exit Sub   AlertButton.Delete   ←←1.ここの部分   'ブックの上書き保存 2.  Sub AlertButton_Click() AlertButtonPushed = True AlertButton.Delete     ←←2.ここの部分 SetTimer End Sub

関連するQ&A

  • EXCELを自動的に終了したい

    VBAマクロで処理をして、終了後に開いたブックを自動的に終了させるため、 Application.Quit を使用しましたが、 他に開いていたブックも終了してしまいます。 ActiveWorkbook.Close に変更すると、 他にブックを開いていない場合、自動的にブックは終了しますが、EXCELが終了しません。 該当のブックだけを終了することは、できないでしょうか?

  • Excel VBAでブックを閉じる時、複数のブックが開いていると・・・。

    WinXP+Excel2002なのですが、 ExcelのVBAでつくったアプリの中に、 Application.Quit ThisWorkbook.Close False と記述し、終了させる部分があります。 複数のブックが開いているときにこのプログラムを実行すると、 他のブックまで閉じようとするのですが、 これは何ともならないのでしょうか。 複数のブックを開いた状態でVBEを開くと、 どのブックをアクティブにしておいても、他のブックの モジュールが出てきますよね。これに関係あるのでしょうか。 VBAはそのブックだけに記述することができる・・・のでしょうか? 調べてみたのですがよくわかりませんでした。 基本的なことで恐縮ですが、こんな私にわかるよう 教えてくださる方いらしたらお願いいたします。

  • ExcelのVBAでブックの保存

    ExcelのVBAでブックを追加し保存を行っています。 その際、保存は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 Workbooks.Add ActiveSheet.Name = "サンプル" ActiveSheet.SaveAs OutFileName ActiveWorkbook.SaveAs OutFileName ActiveWorkbook.Close

  • EXCEL VBAでファイルを保存しないで閉じたい

    EXCEL VBAでファイルを保存しないで閉じたい EXCEL VBAでコードを書いています。ワーク用EXCELが必要で、新規ブックを作成しています。 新規ブックで処理をさせた後に自動でブックを閉じたいと思っています。 そこで, WB.QUIT WB.CLOSE True と書いたのですが、新規ブックは閉じずにそのまま残っている状態です。 これを保存しないまま閉じるにはどのような処理が必要でしょうか?

  • エクセルVBA ブックを閉じるでエラー

    こんにちは。 Excel2007になってから、ブックを閉じる場合にエラーが出力されてしまいます。 以下を全て試してみたのですが、「エクセルは動作を停止しました」とメッセージを出力後、再度エクセルを立ち上げてしまいます。 解決方法をご存じの方がいらっしゃいましたら、教えていただきたく、 お願いいたします。 ThisWorkbook.Close ActiveWorkbook.Close Workbooks("mcr_fi.xls").Close よろしくお願いいたします。

  • Web上のエクセルのVBA操作について

    OSはWin2000、エクセルも2000です。 社内のイントラネット上にエクセルのBOOKを置いてあります。 ダウンロードせずにダブルクリックでイントラ上で開いたこのBOOKに対するVBA操作で、以下の3つを試しましたが、すべてエラーになり、プレビューすることができません。 どう直せばよいのでしょうか? Sub test() ActiveSheet.PrintPreview End Sub Sub test2() ThisWorkbook.ActiveSheet.PrintPreview End Sub Sub test3() x = ThisWorkbook.ActiveSheet.Name ThisWorkbook.Sheets(x).PrintPreview End Sub また Sub 終了() ActiveWorkbook.Close (False) End Sub もまったく働きません。 どうやったら終了できますか?

  • ブックCloseでVBAが続かない

    エクセル2002を使用しています ブック(A)をコピーして名前(B)をつけて別ブックで保存しました ブック(A)を呼び出し後、ブック(B)を閉じてブック(A)のVBAを継続したいのですが 継続しません 作成したモジュールは以下です   Application.DisplayAlerts = False   '【不要なシートを削除する】 Sheets(Array("注文書入手差異表", "入手予定履歴", "main", "営C")).Select ActiveWindow.SelectedSheets.Delete   '【ThisWorkbook.Pathの『注文書確認フォルダ』の中に、名前をつけて別ブックで保存する   '   …ユーザーフォームを使用するのでマクロごと保存】 Dim myFolder As String Dim Filename As String myFolder = ThisWorkbook.Path & "\注文書確認フォルダ" Filename = Format(Date, "yyyymmdd") & "注文書入手予定表" If Dir$(myFolder, vbDirectory) = "" Then MkDir myFolder End If ActiveWorkbook.SaveAs Filename:= _ myFolder & "\" & Filename Application.DisplayAlerts = True '【保存した別ブック名を再取得】 Dim myName0 As String myName0 = ThisWorkbook.Name   '【コピー元のファイルを開く】 Dim myPath As String myPath = Application.Substitute(ThisWorkbook.Path, "\注文書確認フォルダ", "") Workbooks.Open (myPath & "\" & "注文書入手予定表")   MsgBox "【注文書確認フォルダ】の中に別ブックが作成されました"     '【保存した別ブックを閉じる】 Workbooks(myName0).Activate Windows(myName0).Activate ActiveWorkbook.Close '******下のマクロが続かない***************** '====================== Call Macro6 '======================   VBA ステップインで原因を探ろうとしたのでですが   「中断モードでは入力できません」のメッセージがでて   デバッグができません   八方ふさがりの状態です。助けていただけませんか。

  • EXCELブックを保存しないで終了

    EXCEL2000で"A"というブックから"B"というブックを マクロのVBAから開きます。 両方のシートが開いた状態から,"B"のマクロより 両方のブック共に保存しないで、EXCEL自体終了するマクロ を"B"側に下のような感じで作成しました。 -------- EXCEL終了処理 ------------------ Application.DisplayAlerts = False ThisWorkbook.Saved = False Application.Quit ---------------------------------------- これで終了しようとすると、「"B"のブックを保存しますか?」というメッセージが表示されてしまいます。終了前のマクロ処理の中で"B"ブックを変更しているので、このようなメッセージが表示されると思うのですが、 Application.DisplayAlerts = False 命令は利かないのですか? どなたか教えて下さい。宜しくお願い致します。

  • VBA 複数のBOOKの連続操作

    いつもお世話になっております。 複数のブックの更新操作についてわからないことがあります。 複数のブックには項目別のWEBクエリが設定されており、 更新の際にはその都度ブックを開いた上更新しています。 BOOKは4つあり、 BOOK1のコマンドボタンからBOOK2~BOOK4までの更新を実行したいと思っています。 下記のように作ってみたのですが、 BOOK2を更新して閉じた後、BOOK3への処理はスルーされています。 エラーが出るわけではないのですが・・・ 素人のため、説明も要所を得ていませんが、 どうかお力を貸していただけないでしょうか? 下記 BOOK1のマクロ Private Sub CommandButton9_Click() 'ブック2を開いてWEBクエリ更新 Workbooks.Open Filename:="D:\TestBook\test.xlsm" WBN = ActiveWorkbook.Name Application.Run "'" & WBN & "'!Module3.更新して閉じる" 'ブック3を開いてWEBクエリ更新 Workbooks.Open Filename:="D:\TestBook\test2.xlsm" WBN = ActiveWorkbook.Name Application.Run "'" & WBN & "'!Module3.更新して閉じる" End Sub BOOK2~BOOK4 Module3 Sub a1() ' エラーメッセージを表示する(On Errorステートメント) On Error GoTo Err '-------------------------------------------------------- 'webクエリ更新 Range("B6").Select Selection.QueryTable.Refresh BackgroundQuery:=False ’中略 'エラーならブックを上書き保存して閉じます Err: Sheets("sheet1").Select Range("C2").Select Selection.ClearContents Range("P3").Select If ThisWorkbook.Saved = False Then ThisWorkbook.Save End If ActiveWorkbook.Close End Sub 宜しくお願いいたします。

  • VBAでエクセル終了

    エクセル2000です。 VBAで「閉じる」ボタンを作りました。 Sub closeボタン() myYN = MsgBox("終了しますか?", vbYesNo + vbQuestion, "終了確認") If myYN = vbNo Then Exit Sub ThisWorkbook.Close End Sub ところが作動させると「いいえ」を選ぶとすんなり終了してくれますが、「はい」にすると「変更を保存しますか?」を何故か続けて2回も聞いてきます。 2回目も「はい」にすると今度はブック保存のダイアログが出てきて、ブック名が「:」(半角コロン)になってます。 変だなあ、と思い上記のマクロを別ブックを新たに作って標準モジュールに張ってみると正常に作動します。 もとのブックに何かあって、こんな現象が起きているのでしょうか? とっても困ってます。