[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『指定時間経過したら、もしくは、経過していたらマクロを実行させたい』(カトウ)
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:70:00"), "test"
End Sub
Sub test()
実行したいマクロ
End Sub
上記の記述だと、ブックオープン後から70分後に実行したいマクロが動くようにしかならず、困っています。どなたか教えてください。
ブックオープン後から、70分毎に実行したいマクロを走らせたいです。
また、1回目、2回目と走らせる度に、A1セルに回数表示をさせたいです。
ただ、会社のPCに5分何もしないとスクリーンセイバーが掛かってしまう設定(変更出来ない)になっており、基本なにかしら作業をしているのですが、時々、作業をしない時があり、スクリーンセイバーが掛かり、PCをタッチすると、ログインパスを求めてくる画面になってしまいます。
ですから、上記のような状態からログインし、70分を越えていた場合は、すかさず実行したいマクロを走らせてくれるような記述ってできるんですか?教えてください。
< 使用 Excel:Excel2003、使用 OS:Windows7 >
70分後に自動ログイン、というのはちょっと厳しいように思います。自動ログインの必要はあるのですか?
このマクロならずっと動いているわけで、自動ログインなんて関係ないのでは?
マクロが止まってしまうから、というならば、それはPCがスリープ状態にでもなっていませんか?
(???) 2016/01/26(火) 09:14
このような記述でPCをOFFしない限り、70分おきに実行してくれますか?
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:70:00"), "test"
End Sub
Sub test()
実行したいマクロ
Application.OnTime Now + TimeValue("00:70:00"), "test"
End Sub
>70分後に自動ログイン、というのはちょっと厳しいように思います。自動ログインの必要はあるのですか?
自動ログインではなく、スクリーンセイバー状態になり、何かキーボードをタッチすると、ログインパスの画面が表示され、パスを入力しています。なので、スクリーンセイバーの状態でも、マクロは生きているのかと疑問がありまして。。。
(カトウ) 2016/01/26(火) 13:04
電源ランプは、実行中でしょうか? それとも点滅するスリープ状態でしょうか?
(点滅するかどうかはPC次第ですが、点滅して表現するものが多いです)
スクリーンセーバーの起動時間は何分後に設定されていますか?
WINDOWSの電源オプションで、スリープにするまでの時間は何分後に設定されていますか?
スクリーンセーバー時は、裏のプログラムは全て動き続けています。
スリープ状態は、プログラムは全て停止しています。
さて、どちらの状態なのでしょうね? 設定を確認してみてください。
画面が消えている間はマクロが止まっている!、という場合、スリープ状態になっています。
スリープ状態からアプリが自動的に電源を入れて復活するのは、WINDOWSのスケジュール機能を操作しなくてはならず、難しいです。
WINDOWS設定を変更し、スリープしない設定に変えるのが一番ですが、アプリ内からWINDOWSに対し、
動いているからスリープしないでくれ、と要求することもできます。こちらは比較的簡単。
寝てから起きるプログラムではなく、寝ないプログラムにする訳ですね。
例えば、監視周期を10分毎として、7回目に処理することで70分周期の実行を実現する例を書いてみます。
(スリープする時間より短くないと意味がないので、電源オプションは要確認です)
【標準モジュール】
Private Declare Function SetThreadExecutionState Lib "kernel32.dll" (ByVal esFlags As Long) As Long
Const ES_SYSTEM_REQUIRED As Long = 1
Public dNext As Date
Public iCou As Long
Sub test() iCou = (iCou + 1) Mod 7 Sheets(1).Range("B1") = iCou 'debug Sheets(1).Range("C1") = Now 'debug If iCou = 0 Then Sheets(1).Range("A1") = Val(Sheets(1).Range("A1")) + 1 End If
Call SetThreadExecutionState(ES_SYSTEM_REQUIRED) dNext = Now + TimeValue("00:10:00") Application.OnTime dNext, "test" End Sub
この例だと、スクリーンセーバーの実行は邪魔しませんが、スリープ状態には入らなくなります。
(???) 2016/01/26(火) 13:27
電源ランプは、実行中でしょうか? それとも点滅するスリープ状態でしょうか?
>確認してみます。
スクリーンセーバーの起動時間は何分後に設定されていますか?
>5分後です。
WINDOWSの電源オプションで、スリープにするまでの時間は何分後に設定されていますか?
>確認して見ます。
かなりむずかしい記述ですね。
自分なりに、ちょっとアレンジをしてみたんですが、うまくいかない箇所がありまして。
ブックオープン5秒後に、A1セルに1回目、15秒後に2回目とわかるように1,2と入力したいのですが、一度に1〜5を順番に入力してしまい、15秒後にまた1〜5を順番に入力してしまいます。
どうしたら、オープン5秒後に1回目、15秒後に2回目、15秒後に3回目となるのでしょうか?
実際には、10回やりたいと思います。
(カトウ) 2016/01/26(火) 13:40
以下がそうです。
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:05"), "Sample"
End Sub
_____________________________________________
Sub Sample()
Dim i As Integer
Dim mytime As String
For i = 1 To 5
MsgBox "これは" & i & "回目の実行です"
Range("A1").Value = i
Next
mytime = Now + TimeValue("00:00:15")
Application.OnTime mytime, "Sample"
End Sub
(カトウ) 2016/01/26(火) 13:43
【ThisWorkBook】 Private Sub Workbook_Open() Sheets(1).Range("A1") = 0 Application.OnTime Now + TimeValue("00:00:05"), "Sample" End Sub
【標準モジュール】 Public mytime As date
Sub Sample() Sheets(1).Range("A1").Value = Sheets(1).Range("A1").Value + 1 If Sheets(1).Range("A1") < 10 Then mytime = Now + TimeValue("00:00:15") Application.OnTime mytime, "Sample" End If End Sub
次回時刻をグローバル変数にしているのは、次回実行をキャンセルする場合を想定しているためです。
(???) 2016/01/26(火) 14:01
mytime = Now + TimeValue("00:00:15")の場所で
型が一致しません。とエラーが出るようになってしまいました。
なぜ、出るのか、また出るようになってしまったのか教えてください。
よろしくお願いします。
【ThisWorkBook】
Private Sub Workbook_Open() Sheets(1).Range("A1") = 0 Application.OnTime Now + TimeValue("00:00:05"), "Sample" End Sub
【標準モジュール】 Public mytime As date
Sub Sample() Sheets(1).Range("A1").Value = Sheets(1).Range("A1").Value + 1
実行したマクロ
If Sheets(1).Range("A1") < 10 Then mytime = Now + TimeValue("00:00:15") Application.OnTime mytime, "Sample" End If End Sub
(カトウ) 2016/01/30(土) 11:15
mytime = Now + TimeValue("00:00:15")のmytimeをみると、0でした。
(カトウ) 2016/01/30(土) 11:18
本当に 型が違う という、そのエラーは
mytime = Now + TimeValue("00:00:15")
ここででたのですか?
これが最初の実行だとすると、mytime は初期値ですから 0:00:00 だと思いますが。 いずれにしても 右辺の計算を行って、それを mytime に格納(上書き)するわけですから その時のmytime の値は、なんであってもよろしいのですが、本当に、ここで このエラーになったとすると
・左辺、mytime が 日付型ではない。(考えにくいですね。Public mytime As date の規定ですから) ・右辺の計算結果が日付型に代入できないデータ型。(これは、もっと考えられないですね)
エラーは、その1つ上の If Sheets(1).Range("A1") < 10 Then ではないのですか? かつ、そのとき、そのシートの A1 にエラー値が入っているということはないですか?
(β) 2016/01/30(土) 14:03
たとえば、日付をまたぐ場合にエラーが出たりしますか?
(カトウ) 2016/01/30(土) 14:46
いえ、日付を跨ごうが同日であろうが、
mytime = Now + TimeValue("00:00:15")
ここで、そのエラーが出ることはありえないと思うのですが?
>>エラーは、その1つ上の If Sheets(1).Range("A1") < 10 Then ではないのですか? >>かつ、そのとき、そのシートの A1 にエラー値が入っているということはないですか?
この推測はあたらなかったということですか?
(β) 2016/01/30(土) 17:43
失礼します
>>プロシジャ内にあった Dim mytime As String が復活していたりしませんか?
最初、そうかなとも思ったんですが
>>mytime = Now + TimeValue("00:00:15")のmytimeをみると、0でした。
ということでしたので。 String型なら "" と表示されるはずですから。
追記) もっとも コメントしたように 元々が As Date なので、 値は 0 ではなく 0:00:00 となっていると思うんですが。
(β) 2016/02/01(月) 10:24
エクセル2013で実行すると、うまく作動するんですが、2003だと同じところで形が一致しませんというエラーが出てしまいます。
また、2013では15秒でテストしたんですが、2003では本来使用したい70分で記述しています。
明日、2003でも15秒でテストしたいと思います。
本当に申し訳ございません。
何度も、質問ばかりして迷惑、ご面倒かけてすみません。
(カトウ) 2016/02/01(月) 22:29
Application.OnTime mytime, "Sample", , False (???) 2016/03/10(木) 14:09
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.