| このページは 04月のキャッシュ情報です。 |
お待ちとは?
[ 131] Office TANAKA - Excel VBA(「お待ちください」メッセージの表示)
[引用サイト]
http://www.officetanaka.net/excel/vba/tips/tips23.htm
|
マクロで時間がかかる処理を行うとき、画面に「お待ちください」や「処理中です」などのメッセージを表示するにはいくつかの方法があります。ここでは、次の3つの方法をご紹介します。 最も簡単な方法のひとつは、「お待ちください」や「処理中です」などのメッセージをワークシート上にあらかじめ作成しておき、時間のかかる処理中にそのワークシートを表示することです。まずSheet3に次のようなメッセージを作成します。 そして、処理に時間のかかるマクロでは、次のようにSheet3を表示します。なお、本稿では「時間かかるマクロ」としてC:\Windows\System32フォルダ内の各ファイルサイズを合計する処理を行います。実行するパソコンによっては、処理時間に差が出ますのでご了承ください。また、本当はもっと高速に処理することも可能ですが、今回はあえて時間のかかる方法を採用しています。その部分へのツッコミはおやめください(^^; この方法は手軽ですが、いくつかの制約もあります。たとえば、表示するワークシートを変更してしまうので、アクティブシートのセルを操作するようなマクロでは工夫が必要です。また「お待ちください」と表示しただけでは、マクロが終了するまで非常に長い時間がかかるときなど、ユーザーが「ハングアップしたのか?」と不安になります。この簡易テクニックに限りませんが、「お待ちください」メッセージを表示するときは、何らかの形で現在の状況をユーザーに知らせてあげるべきです。では、その2つを加えたサンプルを次に示します。 流れは次のようになります。ここでは、操作したいシートがSheet1で、「お待ちください」メッセージをSheet3に作ったとします。 現在の状況はステータスバー(Application.StatusBar)に表示します。ScreenUpdatingプロパティで画面の更新を抑止していても、ステータスバーは通常通り使えます。処理が終わったら、Application.StatusBarにFalseを指定して、ステータスバーの表示を戻してくださいね。 次に、Windowsのアプリケーションなどでよく見かける[お待ちください]ダイアログボックスを表示する方法を解説します。このテクニックで最大のポイントは「時間のかかる処理をUserFormに実行させる」という考え方です。たとえば次のようなコードではどうでしょう。 時間のかかる処理を行う前にMsgBoxでメッセージを表示してみました。結果は失敗です。メッセージは表示されるのですが、そのメッセージが表示されている間はマクロが停止してしまいます。「''ここから時間のかかる処理」以降を実行するには、メッセージの[OK]ボタンをクリックして閉じなければなりません。失敗の原因は次のような流れだからです。 「お待ちください」メッセージを表示するには、そのメッセージが表示されているバックグラウンドで、時間のかかる処理が行われるような仕組みを作らなければなりません。それにはUserFormを使います。 ここからは、少し複雑になりますから詳細に解説しますね。まずUserFormを1つ挿入してください。名前は「UserForm1」のままでけっこうです。時間のかかる処理は、標準モジュールのSub Sample4から行うものとします。さて、挿入したUserFom1を次のようにデザインします。 ラベルを2つ配置して、それぞれにメッセージを書きました。ここは動作に関係ありませんから、お好きなようにデザインしてください。デザインが完了したら、UserFormをダブルクリックして次のプロシージャを開きます。 プロシージャの先頭に追加した「Me.Repaint」は、UserFormを強制表示させる効果があります。まぁ、念のために書くおまじないだと思ってください。そして最後には「Unload Me」で自分自身を閉じるようにします。時間のかかる処理が終わったらメッセージも自動的に閉じないとマヌケですからね。 そして、このUserFormを表示するために、標準モジュールの「Sub Sample4」に次のようなコードを書きます。 Sample4はUserForm1を呼び出すだけでいいのです。ここで書いたとおりに試したところ正常に動作しました。うまくいかない人は、どこかで間違えていないかチェックしてください。 UserFormを使った「お待ちください」メッセージでは、時間のかかる処理をUserFormに実行させるという考え方が重要です。つまり、次のような流れです。 また、ここでも「現在の状況」をユーザーに知らせる工夫が必要ですが、それはまた別のトピックで詳しく解説します。 お使いのExcelがExcel 2000以降のバージョンでしたら、もう少し簡単な手もあります。それは、UserFormをモードレスで表示する方法です。一般的なUserFormでは、UserFormを表示している間はワークシートやセルを操作できません。そのようなUserFormを「モーダル」な状態と呼びます。それに対して、UserFormを表示している間でもワークシートやセルを操作できる状態を「モードレス」と呼びます。Excel 2000からは、UserFormを表示するShowメソッドに引数を指定できるようになり、UserFormをモードレスで表示することが可能になりました。モードレスなUserFormは、UserFormを画面に表示した直後に、Showメソッドを実行した呼出元のプロシージャに制御が戻りますので、「お待ちください」などのメッセージ(UserForm)を表示したままで次の処理を行うことができます。 UserFormを呼び出すShowメソッドの引数に定数vbModelessを指定すると、そのUserFormはモードレスになります。定数vbModelessの実体は0です。UserFormのActivateイベントなどでは、自分自身(UserForm)をMeというキーワードで参照できましたが、上のように標準モジュールなどからUserFormを操作するときには、もちろんMeキーワードを使用できません。RepaintメソッドやUnloadメソッドで、MeではなくUserForm1などと名前を指定している点に留意してください。 さて最後に、「お待ちください」メッセージに[終了]ボタンを用意して、処理の途中でユーザーが中止できるような工夫を解説します。上の「■UserFormを使ったメッセージ(Excel 97まで)」で作ったUserFormを例に解説しましょう。 コマンドボタン(CommandButton1)を追加して、Captionを「終了」に変えました。この[終了]ボタンをダブルクリックしてコードペインを開きます。 マクロの実行中に、ユーザーが[終了]ボタンをクリックすることで処理を中止できるようにする仕組みは、次のようになります。 ポイントの1つめはDoEvents関数です。時間のかかる処理を行っていると、CPUがその処理に没頭してしまい、その他の操作ができなくなる場合もあります。そうすると、せっかく用意した[終了]ボタンもクリックすることができなくなってしまいます。それを防ぐために、DoEvents関数を実行してCPUの処理を解放してやります。理屈が理解できなくても、必須のおまじないだと思ってください。 次のポイントは、もし変数flagがTrueだったときの処理です。時間のかかる処理はDo Loopステートメントの内部で行われていますので、中止するときはこのループ(繰り返し)を強制終了させなければなりません。Exit Doがその働きをします。Exit Doに関しては「ループ(繰り返し処理)からの強制脱出」で解説していますのでご覧ください。 Excel 2000以降で「モードレス」なUserFormを使う場合も考え方は同じです。このときは、UserFormの呼出元(標準モジュールなど)と、UserForm内のプロシージャ(CommandButton1_Clickなど)の両方で参照できる広域変数が必要ですので、変数flagは標準モジュール側で宣言します。 UserForm側で宣言した変数flagは、UserFormがLoadされるたびに初期化されますので、初期値は毎回Falseになります。しかし、標準モジュール側で宣言した広域変数は、プロシージャが終了してもクリアされない場合がありますので、時間のかかる処理の前で明示的にFalseを指定しておくといいでしょう。ちなみに、こうしたケースで広域変数の値が保持されるかどうかについて誤解している方がとても多いです。非常に奥の深い話ですが、機会があったら別のトピックで詳しく解説しましょう。 冒頭にも書きましたが、時間のかかる処理を行うときはユーザーに「現在処理を行っている」といったアナウンスをするべきです。本稿ではそのために「お待ちください」メッセージを表示するテクニックを解説しましたが、本来なら「現在何を処理している」や「現在どこまで処理が終わった」「完了するまでにはどれくらいかかる」などの情報も提示するべきです。とにかくユーザーに"不安"や"誤解"を与えてはいけません。そうした「進行状況の表示」に関しては、また別のトピックで解説します。 |
[ 132] お待ちしていました
[引用サイト]
http://www.town.ikeda.fukui.jp/dai3/gakko/koucho/17koucho.htm
|
本校は福井県のほぼ中央部に位置する池田町にあります。池田町は武生市、今立町、鯖江市、美山町、福井市などと隣接し、これらの地域との交流が盛んです。山間部であるため冬は雪の多いところですが、美しい杉の山々に囲まれ、学校の前には、足羽川上流の魚見川が流れて、 「自然の謳が聞える里」と呼ぶにふさわしい自然環境の中にあります。池田町には池田第一小学校と池田第三小学校があります。中学校は池田中学校の一校。高校は武生高校池田分校があり、町の教育方針の一つを幼・小・中・高の連携に置くなど大変特色があり、池田町は教育・文化の興隆に力を入れています。 池田町には特筆すべき芸能がいくつも受け継がれています。豊かな自然、祖先たちの大らかな楽しさ、喜びを分かち合う豊かな心は、様々な交流の中から生まれたものであり、これらは厳しい自然条件の中にあっても絶えることはありませんでした。池田町の水海には古代より農民の中に生まれた豊作祈願としての「田楽」と、芸能として発達した「能」の両方を合わせ持つ田楽能舞があり、その精神は町全体に今でも生き続けています。 本校は以前は池田第一小学校の分校でした。昭和44年に池田第三小学校として独立。平成4年には、現在の新しい校舎が完成しました。近代的な機能を持ったランチルーム、吹き抜けのロビー、廊下に壁のないオープン教室、地域公民館と共同利用する体育館やミーティングルームなどを持っています。 しかし、現在は児童数30名の小規模校であり、近年の児童数減少の傾向は本校でも同様であり、地域の人たちが中心となり複式学級解消のための努力が行われています。 一方、児童たちは縦割りのグループでいつも一緒に活動し、上級生は下級生を大切にし、下級生は上級生を信頼するという望ましい関係ができています。少人数の学校の良さを十分発揮しています。 山間の自然豊かな小さな学校であり、能楽の精神が息づく地域の子たちは素朴であり、節度が良く、助け合いの気持ちを十分に持ち合わせています。 「個が輝く学校」を教育目標に、子どもたちが自分の力を発揮して、自己実現できるように地域と家庭、学校が一体となって、学校づくりに取り組んでいます。またへき地複式教育推進校として、国語教育の研究を研究を進めているところです。 このように地域の特性、特長を踏まえながら池田第三小学校にふさわしい教育を研究推進したいと思っております。 |