• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:excelファイルが意図せず起動)

excelファイルが意図せず起動

このQ&Aのポイント
  • excelファイルが起動しないようにする方法を教えてください
  • excelファイルが自動的に終了しない問題を解決する方法を教えてください
  • Excelファイルのタイマーを設定して自動的に保存・終了する方法を教えてください

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

  • ベストアンサー
回答No.1

こんにちは。 >実際5分を待たず、手動でそのexcelファイルを終了した場合、 直接の原因は、原本のコードは、おそらくSetOffTimer というプロシージャーがあったはずなのです。 それを設置しないといけなかったことですが、出されたコードに書き加えるよりも、全面的に書き直したほうがよいと思うのですが…。 OnTime の仕様は、バックグラウンドで動いているそうですから、自動で再起動するというよりも、Excelのマクロを実行しようとします。終了するときには、タイマー予約を切らないといけなかったのです。 そこで、私が考えたのは、 ・何もしなければ、5分で終了する。  --何もしないまま、改変されていた場合は、自動保存して終了する。(それでいいのかな?) ・他のブックで保存されていないものがあれば、タイマーは中止してしまいます。 ・マウスを触ったら、次の5分のタイマーが更新します。ただし、少しでもマウスのトラブルがあると、更新されてしまいます。多少の調整は可能で、計算された、gMoPos の数値を、丸めればよいです。 ・強制タイマー解除は、SetOffTimer を実行してください。 一応、これは32bitのみで、64bitではコードを書き換えないといけませんが、今回はサポートしません。 なお、今まであったマクロコードとは競合しますから、これを使う場合は、新規のブックか、すべて削除してから貼り付けてください。 '// '標準モジュール Option Explicit Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long Private Type POINTAPI     x As Long     y As Long End Type Public MoP As POINTAPI Private Declare Function MessageBoxTimeoutA Lib "user32" (ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long, ByVal wLanguageId As Long, ByVal dlliseconds As Long) As Long Public gTime As Date Public gLastTime As Date Public gMoPos As Long Sub SetTimer()  gTime = Now + TimeValue("00:05:00") '時間設定  gLastTime = gTime + TimeValue("00:00:20")  Application.OnTime Earliesttime:=gTime, _           Procedure:="CloseMe", _           Latesttime:=gLastTime, _           Schedule:=True  GetCursorPos MoP  gMoPos = MoP.x * MoP.y  MessageBoxTimeoutA 0&, "タイマーが設定されました。" & vbCrLf & _  "OKボタンは押さなくてよいです。", "タイマー設定", vbMsgBoxSetForeground, 0, 2000 End Sub Sub SetOffTimer()  On Error Resume Next  Application.OnTime Earliesttime:=gTime, _            Procedure:="CloseMe", _            Latesttime:=gLastTime, _            Schedule:=False 'SetOff には、LastTime を必ず入れる  If Err.Number = 0 Then   MessageBoxTimeoutA 0&, "タイマー設定は解除されました", "タイマー解除", vbMsgBoxSetForeground, 0, 2000  End If  On Error GoTo 0 End Sub Sub CloseMe()  Dim wb As Workbook  GetCursorPos MoP  If gMoPos <> MoP.x * MoP.y Then   Call SetOffTimer '通常は働いていない   Call SetTimer   Exit Sub  End If  For Each wb In Workbooks   If wb.Name <> ThisWorkbook.Name Then    If wb.Saved = False Then     '他のブックが開いて保存されていない場合は、タイマーは中止     MsgBox wb.Name & "は保存されていませんので、" _     & vbCrLf & "終了は中止します。", vbExclamation     Call SetOffTimer     Exit Sub    End If   Else    wb.Save '自ブックは、強制保存で終了   End If  Next wb  Application.Quit  ThisWorkbook.Close False End Sub 'ThisWorkbook モジュール Private Sub Workbook_Open() Call SetTimer End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)  Call SetOffTimer End Sub

puyopa
質問者

お礼

ご返事遅くなり申し訳ございません。 理解するのに、時間がかかってしまいました。 アドバイス頂いた内容を参考にして、なんとか対応できるようになりました。 ありがとうございました。

関連するQ&A