Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11088 / 13644 ツリー ←次へ | 前へ→

【18169】30秒ごとにずっとタイマーをかけたい タイマー30 04/9/16(木) 23:23 質問[未読]
【18170】Re:30秒ごとにずっとタイマーをかけたい ichinose 04/9/16(木) 23:58 発言[未読]
【18172】Re:30秒ごとにずっとタイマーをかけたい Kein 04/9/17(金) 1:51 回答[未読]
【18178】Re:30秒ごとにずっとタイマーをかけたい タイマー30 04/9/17(金) 9:42 質問[未読]
【18190】Re:30秒ごとにずっとタイマーをかけたい Kein 04/9/17(金) 18:04 回答[未読]
【18193】Re:30秒ごとにずっとタイマーをかけたい ichinose 04/9/17(金) 18:33 発言[未読]

【18169】30秒ごとにずっとタイマーをかけたい
質問  タイマー30  - 04/9/16(木) 23:23 -

引用なし
パスワード
   VBAである時間まで(15:00)30秒ごとに処理をさせたいと思っています。
マクロを起動した時も処理をします。
下記のようなマクロつくったらパソコンが固まります。
API関数のsleepで1000ミリ秒強制的にとめたら固まらずに動きますが、ずっと時計マークがでっぱなしです。
もっとスマートな方法をご存知の方いらっしゃいますか?

jikoku = Time '現在時刻をいれる
While Time <= "15:00:00" 'タイマー稼動時間
      
      If (jikoku <= Time) Then
        処理
        jikoku = DateAdd("s", 30, jikoku)
      End If
            
Wend

【18170】Re:30秒ごとにずっとタイマーをかけたい
発言  ichinose  - 04/9/16(木) 23:58 -

引用なし
パスワード
   ▼タイマー30 さん:
こんばんは。

>VBAである時間まで(15:00)30秒ごとに処理をさせたいと思っています。
>マクロを起動した時も処理をします。
>下記のようなマクロつくったらパソコンが固まります。
>API関数のsleepで1000ミリ秒強制的にとめたら固まらずに動きますが、ずっと時計マークがでっぱなしです。
>もっとスマートな方法をご存知の方いらっしゃいますか?
>
>jikoku = Time '現在時刻をいれる
>While Time <= "15:00:00" 'タイマー稼動時間
>      
>      If (jikoku <= Time) Then
>        処理
        doevents
' この手法で行くなら↑これ入れとけば、処理は可能になるかもしれませんが・・。
       
>        jikoku = DateAdd("s", 30, jikoku)
>      End If
>            
>Wend

ApplicationのOntimeメソッドをHelpで調べてみて下さい。
これ使えば、30秒毎の処理は実現できると思います。

【18172】Re:30秒ごとにずっとタイマーをかけたい
回答  Kein  - 04/9/17(金) 1:51 -

引用なし
パスワード
   Sub TimeSC_Start()
  Application.OnTime Time + TimeValue("00:00:30"), "Mymacro"
End Sub

Sub MyMacro()
  If Time > TimeValue("15:00:00") Then Exit Sub

  処理

  Call TimeSC_Start
End Sub

というように、再帰呼び出します。  

【18178】Re:30秒ごとにずっとタイマーをかけたい
質問  タイマー30  - 04/9/17(金) 9:42 -

引用なし
パスワード
   ▼Kein さん:
>Sub TimeSC_Start()
>  Application.OnTime Time + TimeValue("00:00:30"), "Mymacro"
>End Sub
>
>Sub MyMacro()
>  If Time > TimeValue("15:00:00") Then Exit Sub
>
>  処理
>
>  Call TimeSC_Start
>End Sub
レスありがとうございます。
上記のようなコードで、好きなときにマクロをとめたい場合はどうしたらいいのでしょうか?
escキーを押しても止まらないのですが

【18190】Re:30秒ごとにずっとタイマーをかけたい
回答  Kein  - 04/9/17(金) 18:04 -

引用なし
パスワード
   Escキーをトラップするなら、Application.EnableCancelKey を設定しますが、
こちらで簡単なループ処理のマクロを作ってテストしてみましたが、DoEventsを
ループ内に入れても、うまくいきませんでした。あと、OnKey の設定も試しましたが
キーには反応しても
Application.OnTime Time + TimeValue("00:00:30"), "Mymacro", , False
というスケジュールを中止するコードで、デバッグしてしまいました。
ちょっと危険なんで、これ以上はテストできません。あしからず。

【18193】Re:30秒ごとにずっとタイマーをかけたい
発言  ichinose  - 04/9/17(金) 18:33 -

引用なし
パスワード
   Kein さん、タイマー30 さん、こんばんは。
ちょっとKein さんのコードより、長いけど以下のコードを
試してみて下さい。

標準モジュール(Module1)に
'=============================================================
Sub main()
  '設定
  Call mc_schedule(True, TimeValue("17:00:00"), TimeValue("00:00:05"), "test")
End Sub
'==============================================================
Sub test()
  '実際に実行するプロシジャー
  [a1].Value = [a1].Value + 1
End Sub
'==============================================================
Sub subproc()
  '解除
  Call mc_schedule(False)
End Sub


別の標準モジュール(Module2)に
'==================================================================
Private exetm As Variant '次の実行時刻
Private lmtm As Variant '最終時刻
Private reptm As Variant '実行間隔時間
Private prcnm As String '実行プロシジャー名
Sub mc_schedule(ByVal on_off As Boolean, Optional ByVal limit_time As Variant, _
        Optional ByVal rep_time As Variant, Optional ByVal proc_name As String)
'マクロ実行のスケジュールの設定を行う
'input : on_off --- true スケジュール設定 false---スケジュール解除
'    limit_time 実行を繰り返す最終時刻
'    rep_time  実行間隔時間
'    proc_name 実行するプロシジャー名
  On Error Resume Next
  If on_off = True Then
    reptm = rep_time
    lmtm = limit_time
    exetm = Now + reptm
    prcnm = proc_name
    End If
  Application.OnTime EarliestTime:=exetm, Procedure:="mc_exec", Schedule:=on_off
  On Error GoTo 0
End Sub
'=================================================================
Sub mc_exec()
'スケジュール設定されたプロシジャーを実行する
  Dim wk As Variant
  wk = Application.Run(prcnm)
  If Time() + reptime < lmtm Then
    Call mc_schedule(True, lmtm, reptm, prcnm)
    End If
End Sub


プロシジャーmainの実行で10秒おきに「test」を実行します。

途中解除はする場合は、「subproc」を実行して下さい。

私の環境でテストした限りでは、うまく動いてくれました。
確認して下さい。

11088 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free