| -1425- 何とか・・・の続き |
|
この下で書いた Excelのマクロの話。 転んでもタダでは起きない・・・が信条の私としては、バグで依頼主に迷惑をかけつつ、いくつかの新しい手法を考えた。その内の一つは、進捗状況表示(まがい)。 Excel VBAはメッセージ表示中はユーザーのボタン操作待ちになってしまい、バックグラウンドでプログラムの処理をすることができない。つまり時間のかかる処理中はメッセージボックスなどのプログラムの情報を見せることができずアクティブのシートが表示されるだけで、それが全体処理の中のどの辺りで、実際に処理が進んでいるのかハングしているのかも見た目に判断は難しい。Webで検索すると、ユーザーフォームをモードレスという状態で表示させることにより進捗状況を表示させるワザもあるが、出来上がったプログラムのルーチンに結構手を加えなければならない様子。 ![]() 何とか・・・と考えて、図のようなインチキ進捗状況表示をやってみた。要は、1枚余分なシートを挿入し、その中のセルに「処理中です」のようなメッセージを表示するとともに、列幅を狭めたセルの背景色を処理が進むに連れて変えていくというもの。 ループ処理に入ったら カウンターをカウントアップさせるとともに、そのカウンターの値に対応したアドレスのセルの背景色を変えていき、変えた命令の次の命令でシートの表示更新を止めてしまう。こうすることで、処理対象のセル部分が表示されないで、このメッセージ表示のシートが表示され続けるが、このシートの裏では別のシートの処理が進み続ける。(多分、セレクトされたセルを表示させるための表示更新がされない分、幾らかは処理時間も短縮しているはず) 具体的な命令は for i = 1 to max '<ループ処理の最初> ↑ Application.ScreenUpdating = True ↑ wsDisp.Cells(14, ncell).Interior.ColorIndex = 5 ' wsDisp は表示用ワークシートオブジェクト ↑ Application.ScreenUpdating = False ↑ ・・・・ ↑ ・・・・ ↑ ncell = ncell + 1 next i のような感じ。(もちろん上記以外に処理の最初で変数宣言や、セルの塗りつぶしのリセットは必要。) すでに出来上がったプログラムにチョコっと手を加えただけなので、ちょっと荒いが、一応それらしい動作はしてくれている。最初から組み込めばもっと深いところのループ中でカウンターをアップ、セルの色替えをさせて列幅ももっと狭くしてもっと精細な進捗状況バーを表示できるハズ) 写真はノウゼンカズラ。いよいよ夏らしい花が咲き始めた。 |
|
2015/06/05 |