お世話になっております。
VB2005を勉強しております。現在、フォームが一枚だけのシンプルなプログラムを作っています。For~Nextのループ内にApplication.DoEvents()と記述して他の操作を受けられるようにしておりますが、その状態でループ中にフォームを閉じると例外が出てしまいます。それにフォームは消えまても、デバッグ中断ボタンを押すまでプログラム自体はは起動したままです。強制定期にループを破棄する方法をご教授ください。または、ループ中でも正常にプログラムを閉じる方法でも結構です。
ループ内の処理によってエラー内容は違いますが、現在はAccess.Violation.Exceptionという例外がでます。下記のように、なんの処理もしないループを作ってみましたが、やはりこれでも違う例外が出ました。
・その1
For i As Integer = 0 To 1000000000
Application.DoEvents()
Next
・その2
For i As Integer = 0 To 1000000000
Application.DoEvents()
System.Threading.Thread.Sleep(100)
Next
ちなみに、フォームのClosingイベントでフラグを立てて、
For i As Integer = 0 To maxInt
If flag_closing = True Then
Exit For
End If
Application.DoEvents()
Next
などとやってみましたが効果がありませんでした。
よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
ん~ あんまり Endステートメントお勧めしません
本来なら Closeメソッドなどを呼び出して正規の手順を踏むようにしましょう
Endステートメント使ったのは今回のような単純テストの場合や強制終了が必要な場合に限ったほうが良いように思います
MSDNのEndステートメント辺りを参照してみてください
参考URL:http://msdn2.microsoft.com/ja-jp/library/0wt87xb …
お返事遅れてすみません。
MSDN、説明がまだ難しくて敬遠していたのですが、
大変参考になりました。
やはり参照するのは大切ですね。
どうもありがとうございました。
No.2
- 回答日時:
VB.NET2005の WindowsFormアプリケーションなら
Closingイベントではなく FormClosingを使ったほうがいいかもしれません
Closingイベントでフラグを立てる際に 引数の e.CancelをTrueに設定しないと終了処理が続行されてしまいます
FormCloaingイベントで
if ランニングフラグ=True then
e.Cancel = True
ランニングフラグ = False
end if
といった具合にします
イベントの方では
ランニングフラグ = true
for i as integer= 0 to 100000
Application.DoEvents()
if ランニングフラグ = False then
exit for
end if
next
if ランニングフラグ = False then
End
end if
といった具合でしょう
ご回答ありがとうございます。
redfox63さんが教えてくださった方法で思うように終了できるようになりました。が、ちょっと疑問が沸きました。
さっきまでは、いろいろ試行錯誤してとりあえずDisposedイベントにEndと書いて無事終了させることができていました。
redfox63さんが教えてくださったように最後にEndで終了させるということは、ループからわざわざ抜け出すまでもなく、Exit ForをEndに書き換えてしまったり、あるいはClosingのところで直接Endではいけないのでしょうか。
また、現在テキトウにやったようにDisposedイベントのところでEndとするほうが、Closing以降の目に見えないイベントを飛ばさなくて済むので安心な気がするのですが、なにぶん初心者のため自信がありません。
実用上は例外も発生せず、無事終了できるようになったのですが、もう少しアドバイス頂けないでしょうか。
恐れ入りますが、よろしくお願いいたしますm(_ _)m
No.1
- 回答日時:
vb6ですが、フラッグを立てての終了処理はできました。
Dim x As Integer
Private Sub Form_Load()
x = 0
Do
DoEvents
If x = 1 Then Exit Do
Loop
x = 2
Unload Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
If x <> 2 Then
x = 1
Cancel = True
End If
End Sub
この回答への補足
ご返信ありがとうございます。
書いていただいたものを元にまっさらな新規プログラムでやってみたのですが、やはりダメでした。
VB2005にはUnLoadメソッドもUnLoadイベントも無いため、代わりにClosedイベント、Closingイベント、Disposeイベントでフラグを立ててみましたが、やはり終了しませんでした。「NullReferenceExceptionはハンドルされませんでした。」だそうです。
しかしボタンなどでフラグを立てて、ループを抜け出してから終了するとあっさり終了するのですが・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) For~Nextステートメントの終了条件について 1 2023/01/08 18:36
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
Escキーを押すと、中断する時と...
-
DoEventsが必要な理由について
-
範囲指定したセルを1つずつ飛...
-
UWSCの終了の仕方
-
エクセル関数で1〜12の数字がル...
-
「規格外の太陽光パネルQ CELLS...
-
フラグについて
-
VBA for i=1 to lastrow
-
vb.netからエクセル関数書き込み
-
while(*s++=*t++)の判定は?
-
GIFアニメをループさせたくない
-
アクティブセルから、A列最終行...
-
VBA横データを縦にしたいです
-
エディットボックスのテキスト...
-
DOSコマンドのループ内のTIMEコ...
-
データベースをEOFまでループさ...
-
vbscriptでIE自動入力(途中で...
-
vb.netです。2次元配列の要素を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAでの一時停止と再開の方法
-
UWSCの終了の仕方
-
DoEventsが必要な理由について
-
範囲指定したセルを1つずつ飛...
-
Escキーを押すと、中断する時と...
-
DOSコマンドのループ内のTIMEコ...
-
GIFアニメをループさせたくない
-
VBAで3秒だけ時間を止めたい
-
乱数の桁数指定、または範囲指定。
-
アクティブセルから、A列最終行...
-
VBA for i=1 to lastrow
-
テキストボックスの名前に変数...
-
vbscriptでIE自動入力(途中で...
-
エクセルの当番表を作っていま...
-
エクセル関数で1〜12の数字がル...
-
Do whileでExitせず、ループの...
-
VBA Dir関数でファイルをループ...
-
ループフリー
-
vb.netからエクセル関数書き込み
おすすめ情報