none
スクリプトの処理を強制終了させたい RRS feed

  • 質問

  • WindowsXP
    Visual Basic 2005 Express Edition
    そして、「初心者」です。

    スクリプトの処理を途中で強制終了させることはできないのでしょうか?

    メインの処理を行う前にデータのチェックを行って、データに不備があるときは
    「データの○○に問題があります。処理を停止します」のようなアラートを出して
    そこで処理を止めたいのです。止めるというのは中断ではなく終了です。

    VBSを単独ファイルで動かしていたときはErr.Raiseを入れてわざとエラーを発生させて強制終了させてましたが、
    VB2005ではErr.Raiseを入れるとフォーム自体も終了してしまいます。
    スクリプトは途中で強制終了させて、フォーム自体は表示したままにしたいのです。
    いろいろ調べても良くわかりませんでした。
    ここの掲示板で「強制終了」で検索したらEndステートメントが出ましたが
    Endを入れるとやはりフォーム自体も終了してしまいます。
    Exit SubやReturnでプロージャーを抜けても呼び出し元のプロージャーに戻ってそこの処理が継続しちゃいます。
    STOPは一時中断であって強制終了ではない?
    GoToでスクリプトの最終行まで飛ぶ?
    スクリプト全体をTry ~ Catch ex As Exceptionで挟む?
    なんだかどれもすっきりしません。

    フォームを表示したままスクリプト処理を強制終了するにはどうすれば良いのでしょうか。
    よろしくお願い致します。
    2008年8月22日 7:25

回答

  •  rockdom さんからの引用

    Exit SubとかReturnでは最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。

    元のプロシージャって何か分かりませんが、その元のプロシージャに中止したいことを伝える手段を作るのが妥当かと。

    関数の戻り値で処理の継続 or 中止に関する情報を渡すか、Formの変数に中止フラグみたいなものを設定して、元のプロシージャではそれを見てさらにReturnする形にすれば、いずれはClickイベントまで戻りますよね?

     

    イメージとしてはこんな感じですかね。

    Code Snippet

    Private Function WorkA() As Boolean
         ' 何か処理してる

         ' 中止したくなったのでFalseを返す
         Return False
     End Function

     

     Private Function WorkMain() As Boolean
         For i As Integer = 0 To 100
             ' 処理する部分とか

             ' ここで関数WorkAに委譲する
             ' 戻り値がFalseなら中止する
             If Not WorkA() Then Return False

             ' 次のループへ
         Next i
         Return True
     End Function

     

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         If WorkMain() Then
             ' 処理完了
         Else
             ' 中止しました
         End If
     End Sub

     

     

    Code Snippet

    Private CancelFlag As Boolean

    Private Sub WorkA()
        ' 何か処理してる

        ' 中止したくなったのでキャンセルフラグをTrueにしてReturnする
        CancelFlag = True
        Return
    End Sub

     

    Private Sub WorkMain()
        For i As Integer = 0 To 100
            ' 処理する部分とか

            ' ここで関数WorkAに委譲する
            WorkA()
            ' キャンセルフラグがTrueなら中止する
            If CancelFlag Then Return

            ' 次のループへ
        Next i
    End Sub

     

    Private 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

     

     

     

    こういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。

    強制終了ということは考えずに、どのように伝えていくかを考えて下さい。

    2008年8月22日 15:23
    モデレータ

すべての返信

  • そのスクリプトとやらはどうやって実行してるんでしょう?
    実体は vbs ファイルで Shell 関数で起動してるとか?
    2008年8月22日 8:16
  • Visual Basic 2005 Express Editionで作ったフォーム・アプリケーションです。
    フォーム内の「実行」ボタンに記述しています。
    2008年8月22日 9:40
  •  rockdom さんからの引用
    Visual Basic 2005 Express Editionで作ったフォーム・アプリケーションです。
    フォーム内の「実行」ボタンに記述しています。

     

    えーっと、ですから実際どんな手段で VBScript を動作させているのかを聞いているのですよ。

    すでに例が出ているとおり、Shell で実行しているのかとか、ScriptControl を使って実行しているのか等をお聞きしているわけです。

    2008年8月22日 13:58
  •  rockdom さんからの引用

    Visual Basic 2005 Express Editionで作ったフォーム・アプリケーションです。
    フォーム内の「実行」ボタンに記述しています。

    ボタンのClickイベントの中に、VBSに書いていた内容を全て書いているんですよね?

    それは既にスクリプトではありませんので、「スクリプトの処理を終了させたい」というのは現状を表していません。

     

    関数の途中で終了したい(抜けたい)のであれば、Exit SubとかReturnとかすれば、その関数から抜けることができます。

    2008年8月22日 14:07
    モデレータ
  •  rockdom さんからの引用

    Visual Basic 2005 Express Editionで作ったフォーム・アプリケーションです。
    フォーム内の「実行」ボタンに記述しています。

    ボタンのClickイベントの中に、VBSに書いていた内容を全て書いているんですよね?

    それは既にスクリプトではありませんので、「スクリプトの処理を終了させたい」というのは現状を表していません。

     

    関数の途中で終了したい(抜けたい)のであれば、Exit SubとかReturnとかすれば、その関数から抜けることができます。

    2008年8月22日 14:08
    モデレータ
  • 正直言って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では最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。

    2008年8月22日 15:00
  •  rockdom さんからの引用

    Exit SubとかReturnでは最初に書いた通り、元のプロージャーに戻るだけで処理は止まりません。

    元のプロシージャって何か分かりませんが、その元のプロシージャに中止したいことを伝える手段を作るのが妥当かと。

    関数の戻り値で処理の継続 or 中止に関する情報を渡すか、Formの変数に中止フラグみたいなものを設定して、元のプロシージャではそれを見てさらにReturnする形にすれば、いずれはClickイベントまで戻りますよね?

     

    イメージとしてはこんな感じですかね。

    Code Snippet

    Private Function WorkA() As Boolean
         ' 何か処理してる

         ' 中止したくなったのでFalseを返す
         Return False
     End Function

     

     Private Function WorkMain() As Boolean
         For i As Integer = 0 To 100
             ' 処理する部分とか

             ' ここで関数WorkAに委譲する
             ' 戻り値がFalseなら中止する
             If Not WorkA() Then Return False

             ' 次のループへ
         Next i
         Return True
     End Function

     

     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         If WorkMain() Then
             ' 処理完了
         Else
             ' 中止しました
         End If
     End Sub

     

     

    Code Snippet

    Private CancelFlag As Boolean

    Private Sub WorkA()
        ' 何か処理してる

        ' 中止したくなったのでキャンセルフラグをTrueにしてReturnする
        CancelFlag = True
        Return
    End Sub

     

    Private Sub WorkMain()
        For i As Integer = 0 To 100
            ' 処理する部分とか

            ' ここで関数WorkAに委譲する
            WorkA()
            ' キャンセルフラグがTrueなら中止する
            If CancelFlag Then Return

            ' 次のループへ
        Next i
    End Sub

     

    Private 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

     

     

     

    こういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。

    強制終了ということは考えずに、どのように伝えていくかを考えて下さい。

    2008年8月22日 15:23
    モデレータ
  • >こういう手を打たずに「強制終了」としたら、フォームを含めたアプリが強制終了するのは必然です。

    なるほど、良くわかりました。
    MacのAppleScriptでは強制終了する定番コードがあって、
    それはスクリプト処理はキャンセルされるけどフォームまでは落ちないんです。
    どうしても「VBではどうやるのか」というように考えてしまいます。
    初心者にとってはできないことをできないと確信するのは一苦労です。
    できないことはいくら調べても出てこないですからね。

    >強制終了ということは考えずに、どのように伝えていくかを考えて下さい。

    わかりました。
    強制終了に限らず、フラグを立てるのは良くやることなのですんなり理解できます。

    Azuleanさん、長いサンプルコードまで書いていただいてありがとうございました。
    2008年8月23日 3:52