忙しい現代人の腰&肩のお悩み対策!

簡単な問題を出すexcelを作っています。

問題を出した時点でタイマー(ontime)を出し、
1分間だけ猶予を持たせ、
回答が出ればリセットをする。
間に合わなければ「残念でした」を出そうとしています。


Sub start8()
Application.OnTime Now + TimeValue("00:01:00"), "timeout8"
End Sub

Sub reset8()
Application.OnTime Now + TimeValue("00:01:00"), "timeout8", , False
End Sub

Sub timeout8()
"残念でした。"
End Sub

見よう見まねで上記の通り書きましたが、
分からないのは、これだとresr8の引き金を引いてから、1分後のように思います。
ここはどのように書けばいいのでしょうか。

Application.OnTime Now + TimeValue("00:00:00"), "timeout8", , Falseのように書いてみましたが、
エラーになります。

制限時間内にリセットボタンを押せば何事もなかった、という風にやりたいのです。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

Excel 問題」に関するQ&A: Word、Excelの問題集

A 回答 (1件)

Now + TimeValue("00:01:00")の時間を変数に落として


いつでも使えるようにしておく必要がありそうですね。
以下の感じでは如何でしょうか。

Dim ST As Date
Sub start8()
ST = Now + TimeValue("00:01:00")
Application.OnTime ST, "timeout8"
End Sub

Sub reset8()
Application.OnTime ST, "timeout8", , False
End Sub

Sub timeout8()
MsgBox "残念でした。"
End Sub
    • good
    • 0
この回答へのお礼

早速有り難うございました。

教えられてみると、「なるほど」ですね。
コレで、スタートと同じタイミングに立てるわけですね。
やってみます。
有り難うございました。

お礼日時:2015/01/01 17:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAにおけるON TIMEメソッドの解除方法について

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマンドボタンがついているフォームを表示する

End Sub

マクロは大まかに記述しましたが以上のようにすると、一度はマクロの作成が成功したように終了するのですが、ブックを開けたままでいると1時間後に自動的にuserform1が表示されてしまいます。また、ブックを閉じていても自動的にオープンし、(マクロを有効にする)をONにするとデバック状態となります。
変数のtimekpを初期化する事で凌げると思ったのですが、うまくいきません。
以前マクロのヘルプを操作している時にON TIMEメソッドを解除する方法が掲載されていたように思うのですが、探し方がマズイのか見つけられませんでした。
マクロの記述方法がマズイのでしょうか?ON TIMEメソッドを解除しない限り、いつまでもこのメソッドは効力を発揮するのでしょうか?
また、ON TIMEメソッドを解除できるメソッドや良い解決方法がありましたら入門書等を片手にマクロを作成している素人にご教授の程お願い致します。

こんにちは。現在エクセルでフォームを使用したVBAマクロを作成中です。
内容はフォーム内のテキストボックスに制限時間を設けて文字入力を行ってもらうものです。

Sub テスト()

do until
 ・
 ・
call timeup
loop

End Sub

Sub timeup()
dim timekp as integer
'テストの開始時間をキープ

'Application.OnTime timekp + TimeValue("1:00:00"),"endform"
'1時間経過後終了を促すフォームを表示する

End Sub

Sub endform()

load userform1
userform1.show
'エクセル終了のコマ...続きを読む

Aベストアンサー

>ON TIMEメソッドを解除
OnTimeのヘルプはごらんになられましたか?
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)

Schedule にfalseを設定することで、直前の実行指定を解除することができます。
具体的には
Application.OnTime timekp + TimeValue("1:00:00"),"endform",,false
とでもすればいいです。

QExcel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい

ExcelでVBAを使いアプリをつくっています。
プログラムを実行させるボタンはもちろんつくれるのですが、
プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。

ボタンに登録できるのはひとつのプロシージャですよね。
とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

Aベストアンサー

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

Private Sub CommandButton2_Click()
  StopNow = True
End Sub

Private Sub CommandButton1_Click()
  Test
End Sub

起動したプロシージャを止める必要があるということはループ処理と理解。
ならば、ループの条件を操作すれば宜しいかと。
CommandButton1 で起動した Test は CommandButton1 で止めれます。

Application.OnTime TimeValue("16:30:00"), "Test"

で起動しようと同じ理屈。

Application.OnTime は、一種の起動ツール。
当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。

s_husky です。

状況が判明したので再回答!

Public StopNow As Boolean

Public Sub Test()
  Do Until StopNow
    Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1
    Pause 10
  Loop
  If StopNow Then
    MsgBox "Test の実行をストップしました。"
  End If
End Sub

Public Sub Pause(ByVal PauseTime As Single)
  Dim Finish As Single
  
  Finish = Timer + PauseTime
  Do
    DoEvents
  Loop Until Timer > Finish
End Sub

P...続きを読む

QOnTime 使用時のプロシージャへの引数の与え方、その記述方法を教えて下さい。

初心者ですが、宜しくお願いします。

Application.OnTime EarliestTime:=TimeValue(time_ptn), Procedure:="my_func"

上記コードの、末尾のプロシージャの指定において、

Dim prm1 As String, prm2 As Long

Function my_func(prm1,prm2)
   ~内容~
End Function

または、

Sub my_func(prm1,prm2)
   ~内容~
End Sub

というプロシージャを指定したいのですが、
末尾の書き方が分からず困っております。

「Procedure:="my_func(prm1,prm2)"」
「Procedure:= my_func(prm1,prm2)」

のようにやっても、うまくいきません。
正しい書き方をどなたか教えて下さい。

Aベストアンサー

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  'MsgBox x
  'Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:=x
  
End Sub

Sub my_func(prm1 As String, prm2 As Long, prm3 As Long)
  MsgBox prm1 & prm2 & prm3
End Sub

Option Explicit

Sub test()
  Dim s As String
  Dim i As Long
  Dim j As Long
  Dim x As String
  
  s = "a"
  i = 1
  j = 2
  '文字列 & 変数 & 文字列...みたいに繋ぎます。
  MsgBox "'my_func """ & s & """," & i & "," & j & "'"
  Application.OnTime EarliestTime:=Now + TimeValue("0:00:01"), _
            Procedure:="'my_func """ & s & """," & i & "," & j & "'"
  '
  'x = "'my_func """ & s & """," & i & "," & j & "'"
  '...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qエクセルでブックを閉じたときマクロを終了させるには

現在、以下のようなマクロを組んでいます。

---------------------------------------
Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 10 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
End If

End Sub

Private Sub 利用制限ご注意()
警告文 = "共有ファイルを開いて" + CStr(利用制限時間) + "分経過しました。" + vbCrLf
警告文 = 警告文 + "使用しない場合は終了してください。"
MsgBox 警告文, vbCritical, "共有ファイルの利用について"

Workbooks("共有ファイル.xls").Close

End Sub

---------------------------------------

しかし、10分たたずにブックのみ終了し、エクセルのみの起動をしていても10分後には、「共有ファイルを開いて10分経過しました」と出てきます。
エクセルを終了させればよいのでしょうが、ブックを終了させただけでマクロも同時に終了できないでしょうか?

現在、以下のようなマクロを組んでいます。

---------------------------------------
Dim 利用制限時間 As Integer

Private Sub Workbook_Open()

If Not ThisWorkbook.ReadOnly Then
利用制限時間 = 10 '分 + 起動時刻:Now
警告時刻 = Now + 10 * TimeValue("00:01:00") '分に変換
Application.OnTime 警告時刻, "ThisWorkbook.利用制限ご注意"
End If

End Sub

Private Sub 利用制限ご注意()
警告文 = "共有ファイルを開いて" + CStr(利用制限時間) + "分経過しました。" + vbCrLf
警告文 ...続きを読む

Aベストアンサー

こんにちわ。

#7の回答では時間が無くて良く見れなかったのですが、気づいた点を1つ。
警告分では「使用しない場合は終了してください。」と出力しているのですから、
利用継続の有無を確認するべきだと思います。

それらを踏まえてサンプルを乗せます。
そろそろ完成出来るといいですね。

Private 開始時刻 As Date
Private 警告時刻 As Date
'利用制限時間については定数で宣言するよりも、
'設定専用シートを用意し読み込むか、
'又はIniファイルなどから読み込むようにすると
'汎用性を持たせることが出来るでしょう。
Private Const 利用制限時間 As Integer = 10 '分

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)
If Now < 警告時刻 Then Call ResetOntime
If ThisWorkbook.Saved = False Then
If MsgBox("'" & ThisWorkbook.Name & "'への変更を保存しますか?", _
vbYesNo Or vbExclamation, "Microsoft Excel") = vbOK Then
ThisWorkbook.Save
Else
ThisWorkbook.Saved = True
ThisWorkbook.Close
End If
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

Wendy02さんへ。
もしお気を悪くされていたらごめんなさい。
好みの問題もありますから、人それぞれで良いと思います。
出すぎた真似をしてすみませんでした。

こんにちわ。

#7の回答では時間が無くて良く見れなかったのですが、気づいた点を1つ。
警告分では「使用しない場合は終了してください。」と出力しているのですから、
利用継続の有無を確認するべきだと思います。

それらを踏まえてサンプルを乗せます。
そろそろ完成出来るといいですね。

Private 開始時刻 As Date
Private 警告時刻 As Date
'利用制限時間については定数で宣言するよりも、
'設定専用シートを用意し読み込むか、
'又はIniファイルなどから読み込むようにすると
'汎用性を持た...続きを読む

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qタイマーマクロの二重起動防止をしたい

おねがいします。

Sub SetTimer()

On Error Resume Next

'時間変更注意
Application.OnTime TimeValue("00:00:30"), "強制終了"

'時間変更注意
Application.OnTime TimeValue("00:10:00"), "SetTimer"
'時間変更注意
Application.OnTime TimeValue("00:10:30"), "フォルダ作成"



'時間変更注意
Application.OnTime TimeValue("23:52:00"), "プリント"

'時間変更注意
Application.OnTime TimeValue("23:54:00"), "DB保存"

'時間変更注意
Application.OnTime TimeValue("23:56:00"), "DBから日別保存へコピー"

'時間変更注意
Application.OnTime TimeValue("23:58:00"), "表のクリア"


UserForm16.Show

End Sub

以上ののマクロを作成、実行します。
23時52分から一連の作業をして、0時10分に自ら次回のタイマー予約を踏むマクロです。

エクセルは、無人で24時間自動起動させています。

一番最初(ブックを開く)に、どのタイミングでスタートするかわからないので、
workbookプロシージャに
workbook.openのタイミングで
Call SetTimerを入れてあります。

印刷が二回発生して気付いたのですが、
このままだと、0時2分に再起動がかかり、ブックを開きなおします。
(SetTimer)
で、0時10分に自己発動タイマーが働きますよね。(SetTimer二回目)

すると、一連の作業は二重実行されてしまい、困ってます。

マクロ自身にフラグを持たせるんですか?
なんとか、一度だけ実行をすることはできないんでしょうか?

教えてください。おねがいします。

おねがいします。

Sub SetTimer()

On Error Resume Next

'時間変更注意
Application.OnTime TimeValue("00:00:30"), "強制終了"

'時間変更注意
Application.OnTime TimeValue("00:10:00"), "SetTimer"
'時間変更注意
Application.OnTime TimeValue("00:10:30"), "フォルダ作成"
...続きを読む

Aベストアンサー

返事が遅れました。

>実行命令は二回分になっているのでしょうか?
昔、何度も、ここらは実験しています。Excelを終了したら、OnTime 設定はクリアされます。

>命令自体は実行予約をした回数(Settimerをした回数)してしまうものなんですか?

そのとおりです。だから、再帰(ここでは、SetTimerの呼び出し)する場合は、OnTime の命令される側のマクロの中に、SetTimer の呼び出しをさせます。時々、SetTiemr 側に書く人がいますが、別に特に問題はないものの、命令される側のマクロの実行に関係なくマクロの実行を行ってしまうものです。

なお、実行ファイルをUWSCを、他社の環境で使うわけに行かない場合は、Excelの外に出て、多少のクリックの命令などは送ることは可能だと思いますが、最終的に、ハンドルを取らないといけませんので、非公開のツールだと難しいかと思います。

Qエクセルで定期的(30分おき)にマクロを実行させる方法は?

エクセルにて刻一刻変る外部データ(株価)を表示させています。それを自動で30分置きにデータ蓄積させる方法はありませんか?

現在は自分で作ったキーボードマクロで 時計を見ながらボタンを押し、データを取り込ん出る始末です。

その簡単マクロに「30分置きに実行させる」と云う記述を付け足す程度で自動実行させる事は可能でしょうか? 
当方キーボードマクロでの自動書き込みしか出来ない素人ですが、少々複雑な物であっても頑張ってみるつもりですので、どなたかご教授下さい。

Aベストアンサー

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、

 ・ブッククローズをトラップした
 ・進捗状況をステータスバーに表示するようにした
 ・その他しょうもないこと

です。

このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。


Option Explicit

Dim mcolTask As Collection

Sub 実行予約()

  Dim i      As Date
  Dim strProcName As String
  Dim datBigin  As Date
  Dim datEnd   As Date
  Dim datInterval As Date
  Dim datTimeout As Date
  Dim blnJustTime As Boolean

  ' Setting-------------------------------------------------------

  datBigin = TimeValue("10:00:00")  ' 開始時刻
  datEnd = TimeValue("18:00:00")   ' 終了時刻
  datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
  datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
  blnJustTime = True         ' datInterval で丸めるか
  strProcName = "MACRO1"       ' 実行するマクロ名

  '---------------------------------------------------------------

  ' 既に実行予約されているか確認
  If mcolTask Is Nothing Then

    ' 日付シリアル値を加算
    datBigin = datBigin + Date
    datEnd = datEnd + Date
    ' 終了時刻が開始時刻より小さければ日をまたぐので補正
    If datEnd < datBigin Then datEnd = datEnd + 1
    ' 現在時刻が既に終了時刻を過ぎている場合
    If datEnd < Now() Then
      MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
      Exit Sub
    End If
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin < Now() Then
      ' 開始時刻を datInterval で指定された値で丸めるか
      If blnJustTime Then
        datBigin = Application.Floor(Now() + datInterval, datInterval)
      Else
        datBigin = Now() + datInterval
      End If
    End If

    ' 初期化
    Set mcolTask = New Collection

    ' メイン部分
    For i = datBigin To datEnd Step datInterval
      ' 後から取り消せるようにコレクションに退避
      mcolTask.Add CStr(i) & "," & strProcName
      ' Application.Ontime で実行予約を行う
      Application.OnTime EarliestTime:=i, _
                Procedure:=strProcName, _
                LatestTime:=i + datTimeout, _
                Schedule:=True
    Next i
  Else
    MsgBox "既に実行中です", vbInformation
  End If

End Sub

Sub 未実行予約強制解除()
 
  Dim i  As Long
  Dim vntS As Variant
 
  On Error Resume Next
  Application.StatusBar = "タスク破棄中... "
  For i = 1 To mcolTask.Count
    vntS = Split(mcolTask.Item(i), ",")
    Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
  Next i
  Application.StatusBar = ""
  Set mcolTask = Nothing

End Sub

' タスク管理用
Private Sub RemoveTask()
  
  On Error Resume Next
  mcolTask.Remove (1)
  Application.StatusBar = "待機中のタスク... " & mcolTask.Count
  DoEvents
  Beep
  If mcolTask.Count = 0 Then
    Application.StatusBar = ""
    Set mcolTask = Nothing
  End If

End Sub

Sub Auto_Close()

  Dim intRes As Integer
  If Not mcolTask Is Nothing Then
    intRes = MsgBox( _
        Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
           & "破棄して終了しますか?", _
        Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
        Title:="問い合わせ")
    If intRes = vbOK Then
      Call 未実行予約強制解除
    Else
      ' ブッククローズをキャンセル
      Application.ExecuteExcel4Macro ("Halt(True)")
    End If
  End If

End Sub

' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()

  Dim lngRow As Long
  With ThisWorkbook.Sheets("Sheet1")
    lngRow = .Range("V65536").End(xlUp).Offset(1).Row
    .Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
    .Cells(lngRow, "Y").Value = Now()
  End With

  ' ご自分のマクロの最後に次の一行を追加しておいて下さい
  Call RemoveTask

End Sub

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと...続きを読む

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

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり
する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。

そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・

上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょうか?

可能の場合、どのようなVBAになりますか??

よろしくお願いします。


'ブックの上書き保存
ActiveWorkbook.Save
' 保存確認を避けるため、保存済みにする
ThisWorkbook.Saved = True

' 他にブックが開いていなければ、Excelを終了する
If Workbooks.Count <= 1 Then Application.Quit

' 本ブックをClose
ThisWorkbook.Close False

共通でエクセルを使用していますが、時々エクセルを開いたまま外出したり、休憩したり
する方がおり、別な方がエクセルを開いて作業をしたいと思っても、どこかで開きぱなしのことが時々あります。

そんな時のために、エクセルに何も入力等がない一定時間経過したら、自動で保存して閉じる機能を持たせたいと考えています。例えば入力が5分以上なければ自動的に閉じるように・・・・

上書き保存は下記のVBAで機能するのは確認済みですが、これに「5分後」等のタイムの設定をしたいのですが可能でしょ...続きを読む

Aベストアンサー

何かオペレーションが行われたかを監視して、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のファイルを開いて、マウスのホイールでスクロールしながらあちこちシートを眺めているだけの場合など、セル操作や印刷などの操作がない場合にも強制終了されてしまうので、そこはご承知ください。

何かオペレーションが行われたかを監視して、5分ごとにそれをチェックし、オペレーションがされなかったらブックを閉じるというマクロを組んでみました。(最後のオペレーションから5分間監視、ではなく、ブックを開いてから5分間隔でチェックするので、多少のタイムラグがあります)

しかし、「何もしなかったら」というのを検知する方法がわからなかったため、ちょっと強引ですが ThisWorkbook のイベントほとんど全てをを定義して、「何かした」というフラグを立てるという方法になっています。
そのた...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング