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 *

関連記事

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

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

AS400/IBMi クライアントアクセスのキーボード設定

クライアントアクセスのキーボード設定の備忘録です。 「編集」→「設定」→「キーボード」→「編集(C)」で設定する画面のことです。   これですね。枠の中に割り当てたい機能を入力します。基本は …

WordPress プラグインでディレクトリを作成できませんでしたと怒られる

ワードプレスをまっさらにして戻ってきたの投稿以来、ちょこちょこ投稿を重ねている。     そこで表でも作りたいなと思ったので、プラグインのTablePressでも入れようかと思った …

AS400/IBMi ACS RunSQLScriptsでラベルをCOLHDGにする

COLHDG(カラムヘディング)というのは、聞いた話ではAS400にのみある概念らしいですね。 AS400から入った私にとってはそれが普通だと思っていました。   通常SQLではASで別名を …

JavaScript scriptタグを記述する場所

(1)<body>要素の直下や任意の場所 <body>要素は画面を描画する内容が記述されているので、その内容と一緒にするとコードが複雑化する。 また描画中にスクリプトを埋め込む …

Adsense広告




文字で検索

人気記事

なぜだか人気記事

読んでほしい順に