最近 Excel のマクロで、コードを書いている。1000 行余りのデータに加工を施すものなのだが、1000 回ループさせると結構時間がかかる場合があり、その時は、Excel が応答なしになってしまう。今回は、同じ値が縦に続くセルを結合させて、その他条件に合うセルに色をつけたり高さを変えたり... 結構重い。で、これを回避する方法をググってみると、
Application.ScreenUpdating = False Application.Calculation = xlCalculationManual
で、画面の更新と自動再計算を OFF にして、重い処理をして、
Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic
で、元に戻しておくのが常識だそうな。
原因は良く解らないが、これをやってもやっぱり応答なしになってしまう状況が続いた。もう少し調べてみると
DoEvents
をいうのをループ内に入れると、応答なしを回避できるようだ。ただ、やみくもに入れると良くないらしく(試してないが)、ループ何回かに一回くらい呼ぶといいとか。ついでに、その際に、
Application.StatusBar = "処理中" & i & "/" & MaxCount
なんかを入れておくと、ちょっと格好良いかも。ただし、終わったら
Application.StatusBar = False
を入れておかないとカッコ悪いことになるけどね(^^
ということで、まともに使えるようになったのだが、一度 xls ファイルに保存して再度開いたら、あんなに重かった処理が結構数秒で終わるようになっていた。全く原因が分からないが、結果は重かった時と同じ...保存時に何か最適化されたのだろうか。折角工夫をした DoEvents 等不要になってしまった。確かに、上の画面更新と自動再計算は対処したコードは残したまま。一度保存して、やっと効いてきたのか? もう一度画面更新を復活させると重くなったのでそうなんだろうな。
Excel も良くわからん動きをするなぁ。