![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2003769
上記にて、マクロが一度完成していたのですが、以下のような苦情が出てきました。
1.エクセルの右上にある、「×」マークを押した場合に「保存しますか?」と聞かれてくるので、「はい」を押しても内容が保存されていない。
2.「×」マークを押したとき、「はい」「いいえ」のほかに「キャンセル」の表示がほしい。
3.エクセルデータを「読み取り専用」で開いていても10分後に警告文がでてくる。
上記を解消することは、可能でしょうか?もし可能であればサンプルをお願いします。
No.2ベストアンサー
- 回答日時:
エラーの原因は、SetOnTimeが走っていないのにResetOntimeを実行するタイミングがあるからだと思います。
どのタイミングで発生する症状かは、環境に依存するのかな?
ちなみに私のところでは出ませんでした。
なので、汎用性を持った処理に改造をしましょう。
もう少し、自力で解決をする努力をしましょうね。
Option Explicit
Private 開始時刻 As Date
Private 警告時刻 As Date
Private m_bln警告モード As Boolean
'利用制限時間については定数で宣言するよりも、
'設定専用シートを用意し読み込むか、
'又はIniファイルなどから読み込むようにすると
'汎用性を持たせることが出来るでしょう。
Private Const 利用制限時間 As Integer = 1 '分
Private Sub Workbook_Open()
開始時刻 = Now
Call SetOnTime
End Sub
Private Sub 利用制限ご注意()
Dim 警告文 As String
警告文 = vbNullString
警告文 = 警告文 & ThisWorkbook.Name & "を開いて" & CStr(DateDiff("n", 開始時刻, 警告時刻)) & "分経過しました。" & vbCrLf
警告文 = 警告文 & "使用しない場合は終了してください。" & vbCrLf
警告文 = 警告文 & "継続して使用しますか?"
If MsgBox(警告文, vbYesNo Or vbExclamation, "共有ファイルの利用について") = vbYes Then
Call SetOnTime
Exit Sub
End If
ThisWorkbook.Close
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'リセット処理を行う
Call ResetOntime
'変更が無ければ、何もしないで終了
If ThisWorkbook.Saved Then
GoTo PGMEND
End If
'読み取り専用のため、変更は破棄して良いかの問い合わせ
If ThisWorkbook.ReadOnly Then
Cancel = (vbCancel = MsgBox("読み取り専用のため、変更は破棄されます。よろしいですか?", vbOKCancel Or vbExclamation))
If Not Cancel Then
'処理を継続するのであれば、変更状態を無効にする
ThisWorkbook.Saved = True
End If
GoTo PGMEND
End If
'上記に該当しない場合、終了の処理方法を問い合わせ
Select Case MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", vbYesNoCancel Or vbExclamation)
Case vbYes
'保存する
ThisWorkbook.Save
Case vbNo
'変更状態を無効にする
ThisWorkbook.Saved = True
Case vbCancel
'終了をキャンセル
Cancel = True
End Select
PGMEND:
'終了処理がキャンセルされた場合
If Cancel Then
'今から、タイマーを起動する
Call SetOnTime
End If
End Sub
Private Sub SetOnTime()
If Not ThisWorkbook.ReadOnly Then
警告時刻 = DateAdd("n", 利用制限時間, Now) '現在時刻+利用制限時間
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
m_bln警告モード = True
End If
End Sub
Private Sub ResetOntime()
If m_bln警告モード Then
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意", Schedule:=False
m_bln警告モード = False
End If
End Sub
No.1
- 回答日時:
Workbook_BeforeClose関数を変更したらいいです。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'リセット処理を行う
Call ResetOntime
'変更が無ければ、何もしないで終了
If ThisWorkbook.Saved Then
GoTo PGMEND
End If
'読み取り専用のため、変更は破棄して良いかの問い合わせ
If ThisWorkbook.ReadOnly Then
Cancel = (vbCancel = MsgBox("読み取り専用のため、変更は破棄されます。よろしいですか?", vbOKCancel Or vbExclamation))
GoTo PGMEND
End If
'上記に該当しない場合、終了の処理方法を問い合わせ
Select Case MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", vbYesNoCancel Or vbExclamation)
Case vbYes
'保存する
ThisWorkbook.Save
Case vbNo
'変更状態を無効にする
ThisWorkbook.Saved = True
Case vbCancel
'終了をキャンセル
Cancel = True
End Select
PGMEND:
'終了処理がキャンセルされた場合
If Cancel Then
'今から、タイマーを起動する
Call SetOnTime
End If
End Sub
この回答への補足
Private 開始時刻 As Date
Private 警告時刻 As Date
'利用制限時間については定数で宣言するよりも、
'設定専用シートを用意し読み込むか、
'又はIniファイルなどから読み込むようにすると
'汎用性を持たせることが出来るでしょう。
Private Const 利用制限時間 As Integer = 1 '分
Private Sub Workbook_Open()
開始時刻 = Now
Call SetOnTime
End Sub
Private Sub 利用制限ご注意()
Dim 警告文 As String
警告文 = vbNullString
警告文 = 警告文 & ThisWorkbook.Name & "を開いて" & CStr(DateDiff("n", 開始時刻, 警告時刻)) & "分経過しました。" & vbCrLf
警告文 = 警告文 & "使用しない場合は終了してください。" & vbCrLf
警告文 = 警告文 & "継続して使用しますか?"
If MsgBox(警告文, vbYesNo Or vbExclamation, "共有ファイルの利用について") = vbYes Then
Call SetOnTime
Exit Sub
End If
ThisWorkbook.Close
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'リセット処理を行う
Call ResetOntime
'変更が無ければ、何もしないで終了
If ThisWorkbook.Saved Then
GoTo PGMEND
End If
'読み取り専用のため、変更は破棄して良いかの問い合わせ
If ThisWorkbook.ReadOnly Then
Cancel = (vbCancel = MsgBox("読み取り専用のため、変更は破棄されます。よろしいですか?", vbOKCancel Or vbExclamation))
GoTo PGMEND
End If
'上記に該当しない場合、終了の処理方法を問い合わせ
Select Case MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", vbYesNoCancel Or vbExclamation)
Case vbYes
'保存する
ThisWorkbook.Save
Case vbNo
'変更状態を無効にする
ThisWorkbook.Saved = True
Case vbCancel
'終了をキャンセル
Cancel = True
End Select
PGMEND:
'終了処理がキャンセルされた場合
If Cancel Then
'今から、タイマーを起動する
Call SetOnTime
End If
End Sub
Private Sub SetOnTime()
If Not ThisWorkbook.ReadOnly Then
警告時刻 = DateAdd("n", 利用制限時間, Now) '現在時刻+利用制限時間
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
End If
End Sub
Private Sub ResetOntime()
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意", Schedule:=False
End Sub
------------------------------------------------
このマクロを実行した場合に、エクセル右上の「×」をクリックすると、「実行時エラー'11004': 'OnTime'メソッドは失敗しました:'_Application'オブジェクトと表示されてしまいます。その他の動作は問題ないと思われます。指導よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- その他(Microsoft Office) エクセルのマクロについて教えてください。 5 2023/01/21 09:39
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルのオートフィルターのしぼりをクリアーしたい 2 2022/12/24 08:36
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Excel(エクセル) マクロの保存先、開いてるすべてのブックの意味 エクセルを開き、表示→マクロ→マクロの表示と順番に開く 3 2022/06/25 17:52
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どう増強すべきか
-
ExcelのVBAで、選択したファイ...
-
private subモジュールを他のモ...
-
IF文に時間(何時から何時ま...
-
VBAで時刻の記述方法
-
SQLの条件式
-
特定の名前のオートシェイプの...
-
VBA マクロ 英語版WINDOWSで全...
-
【C#/Java?】try-catchでcatch...
-
【VBA】エラー処理で別プロシー...
-
VBAの進捗状況をリアルタイ...
-
マクロで、次のコードへ行く前...
-
特定のファイルを他のプロセス...
-
ドリブン??
-
数値データを書式毎に表示結果...
-
私には複雑すぎて困っています_...
-
リロード対策について困っています
-
Visual C++でのif文
-
Excelマクロ エラー判別
-
イベントの取りこぼしについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
Excel VBA セルの名前があるか...
-
ExcelのVBAで、選択したファイ...
-
どうやってもFor文を抜けてしま...
-
シェルスクリプトでファイル内...
-
ドリブン??
-
特定のファイルを他のプロセス...
-
VB6にてネットワーク上にある共...
-
【VBA】エラー処理で別プロシー...
-
Functionで戻り値を複数返す方法
-
Word VBA。各マクロの間に待ち...
-
エクセル VBAで複数セル選択時...
-
VBA 複数の行を高速で削除する...
おすすめ情報