2016-12-20 7 views
0

Internet Explorerウィンドウ内にユーザーフォームを作成するVBScriptがあります。このウィンドウは、CreateObject(InternetExplorer.Application)を使用して作成されます。問題は、ユーザーがx'ing outでこのウィンドウを閉じると、ウィンドウは閉じますが、スクリプトはエラーをスローします。私はこのエラーを避けたい。私はエラーに関してより具体的にすることはできません。なぜなら、毎回違うからです。私のスクリプトにはループがあり、エラーは、ユーザがx'ingでプログラムを閉じたときにスクリプトが実行していたループ内のどの行を指しているようです。VBScript - ユーザーがIEユーザーフォームを閉じるときにエラーが発生する

私はこれを行うための一つの方法は、wscript.CreateObject(InternetExplorer.Application、「IE_」)を使用して、使用することを知っている:

Sub IE_onQuit 
    wscript.quit 
End Sub 

残念ながら、これは通訳として、私のために動作しません。私はこのコードを実行する必要があるデバイスで使用されてwscriptオブジェクトを認識しません。私のコードはIE 11搭載のWindows 7マシン上で動作するTecanのEVOwareを介して実行されています。EVOwareは、独自のインタプリタにバンドルされているように見え、Windows OSに組み込まれているものを利用しません。 EVOwareのVBscriptインタープリタに関するドキュメントは、少なくとも私が見つけることができるものはありません。しかし、上記で説明したIE_onQuitメソッドを使用せずに、Windowsインタプリタを使用してvbsファイル経由で直接実行すると、同じエラーが発生するため、エラーはEVOware固有のものではありません。 EVOwareのために私はwscriptソリューションを利用できません。

また、On Error Resume Nextを使用してみましたが、これもうまくいきません。これは、スクリプトが無限ループに巻き込まれ、タスクマネージャのプロセスを終了しない限り閉じることがないためです。

wscriptを使用せずに目標を達成する方法はありますか(つまり、エラーを起こさずにユーザーがウィンドウをx-outできるようにする)方法はありますか?あるいは、x-outボタンを無効にすることも許容される解決策です。ただし、IEウィンドウをフルスクリーンにすることでこれらのボタンを隠すことはできません。ここで

は、私のコードの例です:

sHTMLCode = some html code 

Set IE = CreateObject("InternetExplorer.Application") 

With IE 

    .ToolBar = False 
    .StatusBar = False 
    .Resizable = False 
    .Height  = 500 
    .Width  = 400 
    .Left  = 600 
    .Top  = 200 

    .Visible = True 
    CreateObject("WScript.Shell").AppActivate "Internet Explorer" 
    .Navigate "about:blank" 

    While .ReadyState <> READYSTATE_COMPLETE 
     Sleep 0.01 
    Wend 

    .document.title = "Title" 
    .document.body.style.backgroundcolor = "lightgrey" 
    .document.body.innerHTML = "<center>" & sHTMLCode & "</center>" 

    Do Until Protocol_Type <> "" And Number_of_Plates <> "" And Dye_Source <> "" 

     If .document.all.done.value = "clicked" Then 
      .document.all.done.value = False 
      . 
      . 
      . 
      stuff 
      . 
      . 
      . 
       Protocol_Type = sProtocol_Type 
       Evoware.SetStringVariable "Protocol_Type",Protocol_Type 

       Number_of_Plates = sNumber_of_Plates 
       Evoware.SetDoubleVariable "Number_of_Plates",Number_of_Plates 

       Dye_Source = sDye_Source 
       Evoware.SetStringVariable "Dye_Source",Dye_Source 

      Else MsgBox "Please re-enter your protocol parameters.", vbInformation 
      End If 
     End If 
    Loop 
    .document.all.done.value = True 
    .Quit 
End With 
+0

次上記の私のコードでdoループ内のように動作しないライン「の場合sProtocol_Type = 『』またはsNumber_of_Plates = 『』またはsDispense_Volume = 『』その後 MsgBoxには、」すべてのフィールドを完了しなければならないです!送信前にすべての値を入力してください。 "、vbCritical" On Error Resume Nextを使用すると、プロセスを終了するまでMsgBoxステートメントが無限に作成されます。 – margentieri

答えて

0

あなたは、スクリプトの先頭で試すことができます:終了ステートメントの後にエラーコードをキャッチし、無視し、その後

On Error Resume Next 

とそれが原因です。とにかくエラーは何ですか?

+0

私は自分のOPで言ったように、On Error Resume Nextを利用すると、ユーザxが出ていればスクリプトが無限ループに巻き込まれる。私の謝罪、私はその問題を引き起こす私の例のコードのビットを残すことを怠った。すべてのフィールドが完了しなければならない「すると \t \t \t \tのMsgBox 『「もの」のセクションでライン』の場合sProtocol_Type = 『』またはsNumber_of_Plates = 『』またはsDispense_Volume =」内 !送信する前にすべての値を入力してください。"、vbCritical" On Error Resumeを使用すると、プロセスを終了するまでMsgBoxステートメントが無限に作成されます。 – margentieri

1

これはうまくいくのでしょうか?エラー履歴書

if Err.Number<>0 then 
    MsgBox "ERROR: " 
    Exit Do 
End If 
+0

これは完璧です!ちょうど私が必要なもの。エラーで利用するときにErr.Numberに<その後> 0 \t出口が \tをすれば、私はその後 \t 『再開次へ「の場合sProtocol_Type =『』またはsNumber_of_Plates =『』またはsDispense_Volume =』常にループしたif文のMsgBoxを変更しましたElse:MsgBox "すべてのフィールドを完了する必要があります!送信前にすべての値を入力してください。」、vbCritical \t終了の場合 ElseIf ..... " ありがとうございます! – margentieri

+0

ハッピーフェスティヴァ! –

関連する問題