[[20160126035249]] 『指定時間経過したら、もしくは、経過していたらマ』(カトウ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定時間経過したら、もしくは、経過していたらマクロを実行させたい』(カトウ)

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 >


Sub Test() の中でも、Application.OnTime を実行すれば、また70分後に動作するようになりますよ。

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


画面が消えていて、キータッチでパスワード要求するのは、2種類考えられます。
・スクリーンセーバーで、復帰にパスワードを求める設定にしてある場合
・スリープ状態の場合

電源ランプは、実行中でしょうか? それとも点滅するスリープ状態でしょうか?
(点滅するかどうかは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


MsgBoxは処理を止めてしまうので、消しましょう。

 【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


思い描いた通りに出来ました。ありがとうございました。
また何かありましたら、ご協力よろしくお願いします。
(カトウ) 2016/01/27(水) 03:11

教えて頂いた、下記の記述を多少の追加をし、実行させてみたら、

 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


私が変更した Public mytime As date の他に、プロシジャ内にあった Dim mytime As String が復活していたりしませんか?
(???) 2016/02/01(月) 10:21

 失礼します

 >>プロシジャ内にあった 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


βさん、わかりました。
自分のミスでした。70分後にしたかったので、そのまま(00:70:00)と記述してしまいました。
実際には、(01:10:00)と記述したら、見事にできました。
大変お騒がせしてしまい、すみませんでした。
本当に、ありがとうございました。
懲りずに、また力になってください。よろしくお願いします。
(カトウ) 2016/02/02(火) 20:18

ワークブックを閉じるときに、タイマーを停止したいのですが、
Workbook_BeforeCloseにどのような記述をしたら、よいでしょうか?
教えてください。
度々、ご協力していただきありがとうございます。
(アキタ) 2016/03/10(木) 12:42

他人の質問に便乗せず、新規に質問するようにしてください。その上で、過去のこれを参照した、という事を書けば良いです。
[[20160126035249]] のようにすれば、リンクになります。

    Application.OnTime mytime, "Sample", , False
(???) 2016/03/10(木) 14:09

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.