- ベストアンサー
割り込み処理
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
- みんなの回答 (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"
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私の見る限りでは、その発想は無理だと思います。 この場合は、Macro In Macro 状態で、OnTimeメソッドが、待機モードになっているので、OnTime 側のマクロは、解放されるまで、待っているはずです。外部プログラム側から行わないと、それは無理だと思います。一度、OnTime の内容のヘルプを見てくだされば分かるはずです。 仮に、MsgBox が動いても、また、同じく、待機モードになってしまいます。
お礼
早速の回答ありがとうございます。 外部プログラム側から行う方法とはどんなものがあるのでしょうか?
- zap35
- ベストアンサー率44% (1383/3079)
質問文のマクロだと31秒はSleepしますから、3秒後にはマクロの動作中ですね。一旦OSに制御を返す方法はどうでしょう。テストはしていませんが… For i = 0 To 30 Range("A1") = i DoEvents Sleep 1000 Next i
お礼
早速の回答ありがとうございます。 テストしてみましたが、ループ処理中にApplication.OnTimeを優先して実行出来ませんでした。
お礼
いろんな方法があるのですね。勉強になりました。感謝感謝です。 ありがとうございました。