トップ回答者
スクリプトの処理を強制終了させたい

質問
-
WindowsXP
Visual Basic 2005 Express Edition
そして、「初心者」です。
スクリプトの処理を途中で強制終了させることはできないのでしょうか?
メインの処理を行う前にデータのチェックを行って、データに不備があるときは
「データの○○に問題があります。処理を停止します」のようなアラートを出して
そこで処理を止めたいのです。止めるというのは中断ではなく終了です。
VBSを単独ファイルで動かしていたときはErr.Raiseを入れてわざとエラーを発生させて強制終了させてましたが、
VB2005ではErr.Raiseを入れるとフォーム自体も終了してしまいます。
スクリプトは途中で強制終了させて、フォーム自体は表示したままにしたいのです。
いろいろ調べても良くわかりませんでした。
ここの掲示板で「強制終了」で検索したらEndステートメントが出ましたが
Endを入れるとやはりフォーム自体も終了してしまいます。
Exit SubやReturnでプロージャーを抜けても呼び出し元のプロージャーに戻ってそこの処理が継続しちゃいます。
STOPは一時中断であって強制終了ではない?
GoToでスクリプトの最終行まで飛ぶ?
スクリプト全体をTry ~ Catch ex As Exceptionで挟む?
なんだかどれもすっきりしません。
フォームを表示したままスクリプト処理を強制終了するにはどうすれば良いのでしょうか。
よろしくお願い致します。
回答
-
rockdom さんからの引用
Exit SubとかReturnでは最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。元のプロシージャって何か分かりませんが、その元のプロシージャに中止したいことを伝える手段を作るのが妥当かと。
関数の戻り値で処理の継続 or 中止に関する情報を渡すか、Formの変数に中止フラグみたいなものを設定して、元のプロシージャではそれを見てさらにReturnする形にすれば、いずれはClickイベントまで戻りますよね?
イメージとしてはこんな感じですかね。
Code SnippetPrivate Function WorkA() As Boolean
' 何か処理してる' 中止したくなったのでFalseを返す
Return False
End FunctionPrivate Function WorkMain() As Boolean
For i As Integer = 0 To 100
' 処理する部分とか' ここで関数WorkAに委譲する
' 戻り値がFalseなら中止する
If Not WorkA() Then Return False' 次のループへ
Next i
Return True
End FunctionPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If WorkMain() Then
' 処理完了
Else
' 中止しました
End If
End SubCode SnippetPrivate CancelFlag As Boolean
Private Sub WorkA()
' 何か処理してる' 中止したくなったのでキャンセルフラグをTrueにしてReturnする
CancelFlag = True
Return
End SubPrivate Sub WorkMain()
For i As Integer = 0 To 100
' 処理する部分とか' ここで関数WorkAに委譲する
WorkA()
' キャンセルフラグがTrueなら中止する
If CancelFlag Then Return' 次のループへ
Next i
End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' フラグをクリアしておく
CancelFlag = False
WorkMain()
If Not CancelFlag Then
' 処理完了
Else
' 中止しました
End If
End Subこういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。
強制終了ということは考えずに、どのように伝えていくかを考えて下さい。
すべての返信
-
正直言ってVBとVBSの違いが明確にわかっていません。
自動処理を行っているのはAdobe InDesignなのですが、
InDesignはVBSファイルを取り込んでInDesignのパレットからVBSを実行できます。
これは明らかにVBSですが、これだけでは処理に限界を感じて
ときにはVisual Basic 2005 Express Editionでインターフェイスを作ってフォーム・アプリケーションを作ったりもします。
Shell関数でVBSを実行しているわけではありません。
またClickイベントの中に、VBSに書いていた内容を全て入れているわけでもありません。
ここでVBとVBSの違いがイマイチ良くわかってないのですが、
自分はClickイベントの中にVBを記述していると認識しています。
ですので「スクリプトの処理を終了させたい」というのは現状を表してないと言うのはその通りかもしれません。
長いことMacintoshでAppleScriptをやっていて、この1年くらいはVBScriptをやっていたので
ついつい「スクリプト」と言ってしまいました。
要するにClickイベントの中に記述したVBを途中で強制終了できるのかと言うことを知りたいわけです。
Exit SubとかReturnでは最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。 -
rockdom さんからの引用
Exit SubとかReturnでは最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。元のプロシージャって何か分かりませんが、その元のプロシージャに中止したいことを伝える手段を作るのが妥当かと。
関数の戻り値で処理の継続 or 中止に関する情報を渡すか、Formの変数に中止フラグみたいなものを設定して、元のプロシージャではそれを見てさらにReturnする形にすれば、いずれはClickイベントまで戻りますよね?
イメージとしてはこんな感じですかね。
Code SnippetPrivate Function WorkA() As Boolean
' 何か処理してる' 中止したくなったのでFalseを返す
Return False
End FunctionPrivate Function WorkMain() As Boolean
For i As Integer = 0 To 100
' 処理する部分とか' ここで関数WorkAに委譲する
' 戻り値がFalseなら中止する
If Not WorkA() Then Return False' 次のループへ
Next i
Return True
End FunctionPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If WorkMain() Then
' 処理完了
Else
' 中止しました
End If
End SubCode SnippetPrivate CancelFlag As Boolean
Private Sub WorkA()
' 何か処理してる' 中止したくなったのでキャンセルフラグをTrueにしてReturnする
CancelFlag = True
Return
End SubPrivate Sub WorkMain()
For i As Integer = 0 To 100
' 処理する部分とか' ここで関数WorkAに委譲する
WorkA()
' キャンセルフラグがTrueなら中止する
If CancelFlag Then Return' 次のループへ
Next i
End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' フラグをクリアしておく
CancelFlag = False
WorkMain()
If Not CancelFlag Then
' 処理完了
Else
' 中止しました
End If
End Subこういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。
強制終了ということは考えずに、どのように伝えていくかを考えて下さい。
-
>こういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。
なるほど、良くわかりました。
MacのAppleScriptでは強制終了する定番コードがあって、
それはスクリプト処理はキャンセルされるけどフォームまでは落ちないんです。
どうしても「VBではどうやるのか」というように考えてしまいます。
初心者にとってはできないことをできないと確信するのは一苦労です。
できないことはいくら調べても出てこないですからね。
>強制終了ということは考えずに、どのように伝えていくかを考えて下さい。
わかりました。
強制終了に限らず、フラグを立てるのは良くやることなのですんなり理解できます。
Azuleanさん、長いサンプルコードまで書いていただいてありがとうございました。