Excel95になった時であったか。それまではプロシージャが終了する際に ScreenUpdating を True にしなくても自動的に戻っていたのが戻らなくなったのは。




それ以降は ScreenUpdating を True にし忘れないように注意を払っていた。


先日、メッセージボックスを出す際「もしかして ScreenUpdating = False のままだと処理が固まったりする?」などとイタズラ心が芽生えた。もうこうなったら止まらない。


結果を見て気がついた。「ああ、その昔同じことしたよな」って。

ScreenUpdating = False であろうがなかろうが、メッセージは出る。そのメッセージボックスを移動させると False であれば残像が残るし、True なら残像が残らない。

この残像を出さないためにメッセージボックスの表示を関数化し、表示直前に True 、閉じたら 戻す というようにしていたな、ということを思い出した。




スクリーンではなく、頭の中が止まっていたようである。




これは検証中であることを先にお断りしておきます。




先日、15,000件の処理が60秒から2~3秒に短縮した話を書きましたが、なぜか20秒近くかかるようになってしまいました。




処理速度を改善すべく、「動的にメモリを取れないか」と調べると


 Application.MemoryTotal

 Application.MemoryUsed

 Application.MemoryFree

というプロパティは見つけました。が、動的にメモリの確保はできないようだ。




また、調べていると


・Application.MemoryTotal はブックをセーブすると変化する


・Application.MemoryFree は常に一定の値であるようだ


という話を見つけ、試してみたところ、確かにそのようだ。でも実行中にブックの保存なんかしたくないなあ、などと思い悩んでおりました。




そんなこんなで、15,000件の処理を再び実行してみると、今度はまた2~3秒で完了した。




違いはなんだろう?と考えると・・、遅くなったときはブックサイズが 300kb 程度であったが、うっかりンポラリデータを保存していたので 14,500kb くらいになっていました。


もしかするとブックサイズが大きいとメモリが大きく確保されるので高速になる、ということはありうるかもしれません。




私の方でももう少し検証してみます(あまり時間がありませんのでとりあえず簡単に)が、もしご覧の方で実験してみられた方がいらっしゃいましたら、結果をコメント頂けると有難いです。




>> 検証中


仮説は今のところ正しそう。だが、「途中で別のブックをセーブしてもApplication.MemoryTotalは変化するみたい。」です。






VBAでコントロールする中で、最も注意を払わないといけないのが「オートフィルター」かもしれない。


・データベースから読み込んだレコードセットをシートにコピーする際

・データを消去する際


など、フィルタで条件選択がされていたら思いもよらない動作をしてくれることがある。


前者では、

・指定列でない列にデータが貼られた。

・想定していないデータが繰り返し貼られた。

などという事象が起きた経験がある。


オートフィルターを使う場合は

・あらかじめフィルタ内容を残していったん解除

・最後にまた元の状態に復帰・・これは時と場合によるが

を心がけないといけない。