Excel VBA(エクセル マクロ) 小技集そのJ 一定時間経過した後にマクロ自動実行

一定時間経過した後にマクロ実行する方法。
Excel VBAにはウェイト、スリープ関数が標準装備されていない。。

Excel VBAにはウエイト、スリープ関数が無く、何かを実行している(プリンタ、ホームページデータ取り込み等)時に、プログラムを一時停止する方法が難しい。

ExcelにはOnTime関数というものがあって、指定時刻にサブルーチンを実行する関数があるので、OnTime関数で実現する。

http://msdn.microsoft.com/ja-jp/library/cc384090.aspx
小技集そのI 指定時刻、一定時間毎に繰り返しマクロ自動実行

Application.OnTimeは上記参照。


まず、一定期間後プログラム実行。


Sub mes()
Application.OnTime Now + TimeValue("00:00:05"), "mes", Now + TimeValue("00:00:10")
End Sub

Sub mes1()
MsgBox"5秒経過"
End Sub

マクロ"mes"を実行すると、5秒後に"mes1"が実行され、ダイアログで"5秒経過"と表示される。


私の場合、エクセル立ち上げ時にWebからホームページデータの取り込みを行い、値の処理をさせたいため、ホームページ取り込みの時はマクロは実行してもらいたくない。

よって、立ち上げ時にウエイトを入れて、マクロを実行するようにする。

VBE(VBA編集画面)の左側にVBAプロジェクトというものがあって、Thisworkをダブルクリックすると、編集画面が出てくるので、以下のプログラムを入れる。

Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:50"), "dati", Now + TimeValue("00:01:59")
End Sub

そうすると、Excel立ち上げ時にホームページ取り込みが行われ、50秒後にホームページの取り込みが終わった同時にマクロ"dati"が自動実行する。

エクセル立ち上げ時自動実行する方法は下記参照。
小技集そのK Excel立ち上げ時マクロ自動実行


マクロをウェイトをかけて順次実行することはできる。


では、ループの中でウェイトをかけるには??

Excel VBAの標準関数では無理のようです。

私もgotoとか使用して、Waitから戻ってこようと努力しましたが、無理でした。

だって、Application.OnTimeだと別のマクロの最初に飛んじゃうもん。gotoも他のマクロにまたがって飛べないもん。

APIのSetTimerとかsleepを使うのが良いと他のホームページで書かれていました。。

そちらを参考にしてください。


忍者Admaxのテキスト広告で収入UP!

実践!ExcelデータベースTOP