IT関連

ExcelVBA ProgressBarを自作

投稿日:2019年4月22日 更新日:

これは自分の備忘録であり、私が思い出すための記事なのでご了承のほど。

 

5分くらい時間がかかるマクロがあり、固まっていないか心配になると上司から指摘があり、進捗バーを作ろうとする。

 

VBAのプログラム実行中はカーソルがサークル形になり、グルグル回っているが、グルグル回ったまま止まっているのかもしれないし、確かに不安かもしれない。

 

とりあえずユーザーフォームで作って見る。こんな感じ。

 

部品は、

  • 実行中です・・しばらくお待ちください」のラベル
  • 正方形のラベルにborderを付けたものを10個

これだけ。border付ラベルのオブジェクト名はLabel1~Label10にしておく。

このLabel1~Label10の背景色を進捗の過程で1つ1つ変えていく。原理はそれだけです。

ユーザーフォームの名前はUserForm1にしておく。

 

メインロジックはこんな感じ。このソースそのままでは動きません。下で解説してるのでご参考までに。

 

  1. 今回やりたいのは表示をさせた裏でプログラムを走らせることだが、引数に0を指定してモードレスにしておかなければ、処理が先に進まない。
  2. これはユーザービリティの話だと思うけど、最初に青くさせた方が安心感があると思って、とりあえず初っ端Label1を青くしている。
  3. DoEventsをしないと2の変更が画面上変わらないので、これをしておく。画面更新の意味ですね。
  4. これは今回必ずしも必要ないけど、長時間のマクロには画面遷移は不要。オフっておくことでだいぶ速度が速くなる。
  5. ここが実際の処理にあたる。今回は仮なので適当。
  6. ProgressBarの数を10個にしているとBreakPointが9個無いと全部青くならないので、最後にすべて青くする処理を施す。
  7. 画面遷移を元に戻しておく。
  8. プログラム終了前にユーザーフォームを閉じる。

 

これがブレークポイントで呼び出すサブルーチンのコード。

 

  1. このコードは別から呼び出されるのでパブリック変数として次に青くするラベルの数を保存しておく
  2. ブレークポイントがLabel10を超えてしまうかもしれないので一応エラーを無視しておく
  3. Progress_cntは0からスタートする。メインでLabel1を青くしたから、+2をしてLabel2からスタート。
  4. UserForm1.Controls(引数)でLabel1~10を指定できる。これで青くする。
  5. カウンターを足しこむ

 

最後にすべてのラベルを青くするコード

 

  1. スリープを使えるようにする。プログラムの処理は一瞬なので少し間をあけてラベルの色を変えないと視認できない。
  2. 1秒だと長いので0.5ミリ秒にする
  3. Labalは10個あるので、現在のカウントから10まで回す。
  4. スリープをする。ただし⑤の処理でSleep_Timeが̠̠マイナスになっても大丈夫なように1以上のときに実行する
  5. 毎回0.5秒ずつ増えていくと単調なので、徐々に減らして加速する。

 

こんな感じ。変に固まってUserFormが後ろに隠れてしまうことがたまにあるので、万能ではないかもしれない。

ただユーザを不安にさせない時間稼ぎくらいにはなるだろう。

あとVBAのコントロールにはProgressBarがあったらしいが、最近無くなったそうです。もしかしたら見つけられないだけかも。

スポンサーリンク




スポンサーリンク




-IT関連
-, ,

執筆者:


comment

Your email address will not be published. Required fields are marked *

関連記事

キャノン えらんでマイプリントですぐに印刷される場合の設定

キャノンにえらんでマイプリントという、どうでもいい機能がある。 基本はキャノンの人間が設定して帰るが、新しいパソコンに買い替えたとたんその機能が効かなくなる。 それは複合機もさることながら、PC側にも …

Git 自分の備忘録

書きかけですし、未検証です。ご了承ください。   gitとは プログラムソースのバージョン管理システムのこと。 gitの用語で大事なのは、 作業ディレクトリ ステージングエリア リポジトリ …

Webページを自動送りしてTwitterのタイムラインをプロジェクターで紹介する

先日、某関連会社に出向中の先輩から、「ウチの会社のTwitterをプロジェクターで映したいのだがいい方法はないか」と相談を受けた。   その人は社長なんだが、毎朝1件をツイートすると決めてお …

このスクリーンセーバーには、より新しい種類のビデオカードまたはDirect3D・・・

職業柄パソコンをセッティングする機会が多いのだが、過去にある一台がスクリーンセーバーの設定のとき、 「このスクリーンセーバーには、より新しい種類のビデオカードまたはDirect3Dと互換性のあるビデオ …

AS400/IBMi 無料で Web化 GUI化 オープン化 フラットなPHP編

注意 これは私の環境下における私の備忘録です。お使いの環境によっては内容が異なる場合があります。私は何も責任を負いませんのでご了承のうえご覧ください。   内容 AS400のいいところはたく …

Adsense広告




文字で検索

人気記事

なぜだか人気記事

読んでほしい順に