EXCELマクロ実行時の「応答なし」を回避する 
2014/12/25 Thu.
EXCELマクロで時間のかかる処理を実行させたら、10秒そこらで「応答なし」となってしまう。
プログラムを見直して、何度実行させても実行後ちょっとしたら「応答なし」となる。
件数の問題か・・・?
!メモリか?!と思いリソースモニターを見てみるが、メモリの問題ではなさそう・・・・・・
ん?応答なしと表示されてるが、excel.exeがCPUを使用している・・・。動いているね?これ。
ひょっとしてと思いネットを探ってみると、やはり、EXCELで重いマクロを動かすと表面上「応答なし」となるようだ。
これを回避する方法として、重たいループの中に
DoEvents
という関数を入れると解決。
これで実行してみると、うん。応答なしにならない。
処理カウンターも表示されている。
・・・が、ちょっと重いな。
さらにネットを探ると、重いループ処理をさせるときはEXCELの表示機能を停止させると良いとのこと。
Application.ScreenUpdating プロパティ (Excel)
ループ処理の前に
Application.ScreenUpdating = False
処理後に
Application.ScreenUpdating = True
しかし、これではセルに表示していた処理カウンターが表示されない。
そこで、EXCEL下部のステータスバーに処理カウンターを表示させることにする。
Application.StatusBar = "処理カウント" & curr & "/" & maxdata
同じく処理後に
Application.StatusBar = False
ついでに、ループごとに表示させる必要もないのでdateDiff関数で5秒ごとにDoEventsを呼び出すことにしました。
dateDiff("s", date1, date2)
この関数の注意としては、date2 - date1で計算される点。
おっと、後々勘違いしそうだ。
この関数はタイマー関数ではない。あくまでも日時の差分を取得するだけの関数。
さて、この仕組みを組み込んでマクロを実行したら、、、あはははは。めっちゃ速い。
プログラムを見直して、何度実行させても実行後ちょっとしたら「応答なし」となる。
件数の問題か・・・?
!メモリか?!と思いリソースモニターを見てみるが、メモリの問題ではなさそう・・・・・・
ん?応答なしと表示されてるが、excel.exeがCPUを使用している・・・。動いているね?これ。
ひょっとしてと思いネットを探ってみると、やはり、EXCELで重いマクロを動かすと表面上「応答なし」となるようだ。
これを回避する方法として、重たいループの中に
DoEvents
という関数を入れると解決。
これで実行してみると、うん。応答なしにならない。
処理カウンターも表示されている。
・・・が、ちょっと重いな。
さらにネットを探ると、重いループ処理をさせるときはEXCELの表示機能を停止させると良いとのこと。
Application.ScreenUpdating プロパティ (Excel)
ループ処理の前に
Application.ScreenUpdating = False
処理後に
Application.ScreenUpdating = True
しかし、これではセルに表示していた処理カウンターが表示されない。
そこで、EXCEL下部のステータスバーに処理カウンターを表示させることにする。
Application.StatusBar = "処理カウント" & curr & "/" & maxdata
同じく処理後に
Application.StatusBar = False
ついでに、ループごとに表示させる必要もないのでdateDiff関数で5秒ごとにDoEventsを呼び出すことにしました。
dateDiff("s", date1, date2)
この関数の注意としては、date2 - date1で計算される点。
おっと、後々勘違いしそうだ。
この関数はタイマー関数ではない。あくまでも日時の差分を取得するだけの関数。
さて、この仕組みを組み込んでマクロを実行したら、、、あはははは。めっちゃ速い。
- 関連記事
category: VBA
この記事へのコメント
コメントの投稿
コメントは全て管理人が内容を確認してから表示されます(非公開コメント除く)。
内容によっては表示されない場合がありますことご了承願います。
内容によっては表示されない場合がありますことご了承願います。