
非常に時間のかかる繰り返し処理を行なうプログラムを作りました。どのくらい、プログラムが進行しているのかわかりやすくするため、
Progress.Show
でProgressという名前のフォームを表示し、そこに、プログラムが何%終わったのか表示するようにしました。
プログラムはDo Loop文が使ってあるので、何%終わったのかを表示するためにLoopした回数を取得して、それをフォームに表示することにしましたが、どこかで調べたら機械は、Do Loopのあいだはフォーム上に文字を表示するのに手が回らないからDoEventsを使ってイベントを実行させなさい、といわれました。
そこまではうまくいきました。プログラムを実行すると、プログラムが実行されて何%終わったかもちゃんと表示できるようになりました。
ところが、プログラムの実行中にフォームの右上の×ボタンを押したところ、フォームは画面から消え、プログラムが終了したように見えるのに、VB Editorでは[実行中]となっており、終わってくれません。ずっとDo Loopが実行されたままです。
Private Sub Form_Terminate()
のところに
Unload Progress
と書いても、「Unloadメソッドは使えません」などというエラー・メッセージが出ます。(フォーム上にボタンを置き、そこをクリックするとUnloadするようにしてみましたがやはり同じことを言われました。)
原因は何でしょうか?
フォームをUnloadする、ということの意味をちゃんと理解していないのでいけないのだと思うのですが、調べてもよく言っていることがわかりません。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
>いったんLoopに入ったら、中断させる方法がない、ということでしょうか。
Exit Doで抜けられますが・・・(^^;
というより、この場合無限Loopは使うべきじゃないですね。
#2さんが言われるようにキャンセルボタンを置いて
キャンセルボタンではキャンセルフラグをON(TRUE)にします。(キャンセルフラグはモジュール変数)
Do While (キャンセルフラグ=FALSE and 100%じゃない )
表示処理
DoEvents
Loop
のようにします。
# Untilを使うと分かりやすいですがあえてWhileで。
>Timerをつかうと、途中で中断できるのでしょうか。
考え方は上記と一緒です。
Timerイベントでキャンセルボタンが押されたかどうかをチェックすればいいだけです。
#1さんが(描画にも)Timerを使ったほうがいい、というのはタスクマネージャでCPU使用率を表示させてみると分かると思います(^^;
また、この原因はDoEventsを使っているから、なんですけどね(^^;
DoEventsを使うと、時間が掛かる処理中にも別のイベントが発生(この場合はUnload)するからで、なおかつLoopを抜けていないからですね。
Do Whileを使うなら、UnloadイベントにもキャンセルフラグをONにするコードを書けばループを抜けてくれるので終わってくれるはずです。
#3さんの「Endを使えば」というのは手っ取り早く確実な方法ですが、個人的には使うべきじゃないと思います(^^;
このケースでは関係ないですが、オブジェクトの寿命に無頓着になりがちだからです。
この回答への補足
BLUEPIXYさん、kahaさん、piyo2000さん、ありがとうございます。
いろいろと教えていただきましたが、僕は重大な勘違いをしていました。Unloadというのは、「全部やめなさい」という意味だと思っていたのです。ですからUnloadを書いた時点で何もかも終わるはずだと思っていたのです。
ところがpiyo2000さんのお答えの中で、UnloadイベントにフラグをOnするコードをかけば、、、というのがありました。Unloadしたら全部終わるのだからUnload後にコードを書いても無駄では?と思ったのですが、Unloadはそういうことではないのですね??
>Do While (キャンセルフラグ=FALSE and 100%じゃな
>い )
>表示処理
>DoEvents
>Loop
>のようにします。
たいへんわかりやすいです。思いつきませんでした。ということは、UnloadしたときにキャンセルフラグをTrueにするようにしてもいいということですね。
No.3
- 回答日時:
> Unload Progress
> と書いても、「Unloadメソッドは使えません」
Progress.Showと呼び出し元が先に終了してしまっているからではないでしょうか?
呼び出し元で×ボタンで終了直前に呼ばれるQueryUnloadイベントの処理にステートメントの End を実行するよいうにすればどうでしょうか?
No.2
- 回答日時:
>ユーザがいやになったら中断できるようにしたい
Progressフォームにキャンセルボタンを置いて
押されたら中断するようにすればいいでしょう
また、×ボタンを押したら、キャンセルボタンクリックイベントを実行するようにしておけばより良いと思います。
No.1
- 回答日時:
>原因は何でしょうか?
プロセスが動いたままだから。
>ずっとDo Loopが実行されたままです。
これです。
Loopから抜けなければプロセスは終わりません。
>Do Loopのあいだはフォーム上に文字を表示するのに手が回らないからDoEventsを使ってイベントを実行させなさい、といわれました
DoEventsだけでは重いのでSleepも入れた方がいいでしょう。
いや、Loopで回すのではなくTimerを使うのがよいと思います。
この回答への補足
ありがとうございます。
ということは、いったんLoopに入ったら、中断させる方法がない、ということでしょうか。
また、Timerをつかうと、途中で中断できるのでしょうか。かなり時間のかかる処理なので、ユーザがいやになったら中断できるようにしたいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Outlook(アウトルック) outlook メモリ不足 1 2022/05/31 10:16
- Visual Basic(VBA) vba GetAsyncKeyState関数について 1 2023/08/24 12:08
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript ラジオボタンによるフォームの開閉を行いたい 3 2022/03/31 21:30
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
MACアドレスの調べ方
-
パソコンの演算速度について
-
C言語で途中までしか、プログラ...
-
ファイルの開き方
-
コンパイルできません。
-
ウィンドウズビスタはXPに比べ...
-
sendkeysにてALT+CTRL+INSERTを...
-
コマンドプロンプト上で動作す...
-
Notifyiconのアイコンを変更し...
-
exeファイルが開かないのはなぜ...
-
C言語のコマンドライン引数って...
-
プログラミング ソースコード
-
フォルダーに指定したファイル...
-
機械語ダンプリストについて。
-
グリッドコンピューター
-
システム資源とは?
-
ウイルスは必ずタスマネのプロ...
-
独立した複数のプログラムを統...
-
timeEndPeriodを呼ばないと
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
パソコンの演算速度について
-
VB上で実行中の無限ループの止め方
-
sendkeysにてALT+CTRL+INSERTを...
-
C言語で途中までしか、プログラ...
-
VBAで外部プログラムを非表示で...
-
システム資源とは?
-
実行時エラー429
-
終了してもプログラムが実行し...
-
sleep()関数について
-
他の実行ファイルを実行するプ...
-
RPG パラメーターについて
-
UWSCがうまく動かない
-
Windows10でDOSゲーム
-
clock関数は正確じゃないの?
-
C言語でプログラムを再起動
-
Excel VBA から外部プログラム...
-
system関数を使用してsuコマン...
-
プロセス間通信について
-
Borland C++を利用しているので...
おすすめ情報