プロが教えるわが家の防犯対策術!

Application.OnTimeで一定時間後に処理をさせたいのですが
For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。
ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか?


Option Explicit
Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)

Private Sub CommandButton1_Click()
Call M1
End Sub

Private Sub M1()
Dim i As Integer
Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2"
For i = 0 To 30
Range("A1") = i
Sleep 1000
Next i
End Sub

Sub M2()
MsgBox ("123")
End Sub

A 回答 (3件)

こんにちは。



>外部プログラム側から行う方法とはどんなものがあるのでしょうか?

簡単な例ですと、以下のようなスタイルです。
タイムラグは仕方がないのですが、より正確に行おうとすれば、APIを用いるしかないのですが、昨日の時点では、私は不得意なので、開いているExcelすべてが消えてしまいました。

以下は、Wscript.Sleep の3秒や、PopUpの2秒は、正確に保たれるわけではありません。
しかし、PopUpをクリックする必要はありません。

Sub M1R()
Dim i As Integer
'MySleep.vbs は、Excelデフォルトのフォルダにあること
Shell "Wscript.Exe MySleep.vbs"
'場合によっては必要かもしれません。
'AppActivate Application.Name
For i = 0 To 30
Range("A1") = i
DoEvents
Sleep 1000
Next i
End Sub


'メモ帳で作る

'mySleep.vbs
Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
Wscript.Sleep(3000)
WshShell.PopUp "123", 2, "テスト"
Set WshShell = Nothing


また、mySleep.vbs の設置場所が、任意の場合は、オートメーションで、パスはショートネームにしたほうが楽です。

Dim mFolder As String
Dim mPath As String

mFolder = ThisWorkbook.Path
mPath = CreateObject("Scripting.FileSystemObject").GetFolder(mFolder).ShortPath
Shell "Wscript.Exe " & mPath & "\MySleep.vbs"
    • good
    • 0
この回答へのお礼

いろんな方法があるのですね。勉強になりました。感謝感謝です。
ありがとうございました。

お礼日時:2007/09/15 14:04

こんばんは。



私の見る限りでは、その発想は無理だと思います。

この場合は、Macro In Macro 状態で、OnTimeメソッドが、待機モードになっているので、OnTime 側のマクロは、解放されるまで、待っているはずです。外部プログラム側から行わないと、それは無理だと思います。一度、OnTime の内容のヘルプを見てくだされば分かるはずです。

仮に、MsgBox が動いても、また、同じく、待機モードになってしまいます。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
外部プログラム側から行う方法とはどんなものがあるのでしょうか?

お礼日時:2007/09/14 06:44

質問文のマクロだと31秒はSleepしますから、3秒後にはマクロの動作中ですね。

一旦OSに制御を返す方法はどうでしょう。テストはしていませんが…

For i = 0 To 30
 Range("A1") = i
 DoEvents
 Sleep 1000
Next i
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
テストしてみましたが、ループ処理中にApplication.OnTimeを優先して実行出来ませんでした。

お礼日時:2007/09/14 06:38

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