ExcelVBAの処理を画面非表示で高速化+進捗状況を表示する
ExcelVBAはブックやシートを行ったり来たり、セルに値がひとつずつ入っていくのが(たとえ高速だとしても)がっつり見えます。最初こそ「おー、動いてる」と思えますが、時間が長いと目障りにw 画面表示をオフにすると、劇的に高速になりますよ!
スクリーンアップデートをオフに
Application.ScreenUpdating = False '処理 Application.ScreenUpdating = True
処理をこのコードで括るだけ!セルへの入力やシート・ブックの切り替えを非表示にすることで本当に速くなります。
すっごいよく使うわりに、ちょっとコードが長くて、いつも「あー、あれ、どうやって書くんだっけ!」と言っては過去のプログラムを引っ張り出してコピペをするという無駄なことをしていたので、この記事を書いたことをきっかけに辞書登録しましたw
「これ、ちゃんと動いてるの?」という不安
超速くなってすごく良いんですが、例えば、処理が30秒→10秒になったとしたとき、10秒間画面がまったく変わらないというのは、ユーザー側は不安ですよね。待ってるほうの数秒ってすごく長く感じますし。ですので、併用して進捗表示をおすすめします。
お手軽に進捗表示
こんな感じのユーザーフォームを作りましょう。しかくの部分は、ラベルで“□”と入れているだけです。
Sub サンプル() Application.ScreenUpdating = False With UserForm1 .Label1 = "□ □ □ □ □" 'リセット .Show vbModeless 'フォームを処理続行モードで開く .Repaint '強制表示 'ここに処理1 .Label1 = "■ □ □ □ □" 'ここに処理2 .Label1 = "■ ■ □ □ □" 'ここに処理3 .Label1 = "■ ■ ■ □ □" 'ここに処理4 .Label1 = "■ ■ ■ ■ □" 'ここに処理5 .Label1 = "■ ■ ■ ■ ■" .Hide End With Application.ScreenUpdating = True End Sub
で、こんな風に処理の段階に分けてラベルをひとつずつ“■”にしてあげたものを上書きすると、処理中に簡易的なプログレスバーのような役割をしてくれます!普通にプログレスバーもあるんですが、あれはmaxとminを数値で指定しないといけないので、用途によっては使いづらいかなーと。
実際に動かしてみるとこんな感じ。もちろん□の数はいくらでも設定できますよ。変更が反映されない場合は、ラベルを変えた後に.Repaint
(7行目と一緒)をそれぞれ入れてあげるといいみたいです。
以上です!私は良く使う手法なので、どなたかのお役に立てれば幸いです。
ExcelVBAに興味をお持ちの方は、こちらの記事もどうぞ!
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。