ExcelVBAの処理を画面非表示で高速化+進捗状況を表示する

ExcelVBAの処理を画面非表示で高速化+進捗状況を表示する

ExcelVBAはブックやシートを行ったり来たり、セルに値がひとつずつ入っていくのが(たとえ高速だとしても)がっつり見えます。最初こそ「おー、動いてる」と思えますが、時間が長いと目障りにw 画面表示をオフにすると、劇的に高速になりますよ!


スクリーンアップデートをオフに

Application.ScreenUpdating = False
'処理
Application.ScreenUpdating = True

処理をこのコードで括るだけ!セルへの入力やシート・ブックの切り替えを非表示にすることで本当に速くなります。

すっごいよく使うわりに、ちょっとコードが長くて、いつも「あー、あれ、どうやって書くんだっけ!」と言っては過去のプログラムを引っ張り出してコピペをするという無駄なことをしていたので、この記事を書いたことをきっかけに辞書登録しましたw

「これ、ちゃんと動いてるの?」という不安

超速くなってすごく良いんですが、例えば、処理が30秒→10秒になったとしたとき、10秒間画面がまったく変わらないというのは、ユーザー側は不安ですよね。待ってるほうの数秒ってすごく長く感じますし。ですので、併用して進捗表示をおすすめします。

お手軽に進捗表示

120615-1

こんな感じのユーザーフォームを作りましょう。しかくの部分は、ラベルで“□”と入れているだけです。

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を数値で指定しないといけないので、用途によっては使いづらいかなーと。

120615-2

実際に動かしてみるとこんな感じ。もちろん□の数はいくらでも設定できますよ。変更が反映されない場合は、ラベルを変えた後に.Repaint(7行目と一緒)をそれぞれ入れてあげるといいみたいです。

以上です!私は良く使う手法なので、どなたかのお役に立てれば幸いです。

公開日:2012/06/15

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。