2016-12-20 2 views
0

У меня есть VBScript, который создает пользовательскую форму в окне Internet Explorer. Это окно создается с помощью CreateObject (InternetExplorer.Application). Проблема в том, что если пользователь закрывает это окно путем x'ing out, окно закрывается, но скрипт затем выдает ошибку. Я хочу избежать этой ошибки. Я не могу быть более конкретным в отношении ошибки, поскольку она отличается почти каждый раз. В моем скрипте есть цикл, и ошибка, кажется, указывает на любую строку внутри этого цикла, которую выполнял мой скрипт, когда пользователь закрывает программу путем x'ing out.VBScript - ошибка при закрытии пользователем пользовательской формы IE

Я знаю, что один из способов сделать это состоит в использовании WScript.CreateObject (InternetExplorer.Application «IE_»), а затем использовать:

Sub IE_onQuit 
    wscript.quit 
End Sub 

К сожалению, это не будет работать для меня, как переводчика используемый устройством, мне нужно запустить этот код, не распознает объект wscript. В случае, если это имеет значение, мой код выполняется через EVOware от Tecan, работающий на компьютере под управлением Windows 7 с IE 11. EVOware, похоже, поставляется вместе со своим собственным интерпретатором и не использует встроенную в ОС Windows. Никакой документации по интерпретатору VBscript EVOware, похоже, не существует, по крайней мере, никому из них не удалось найти. Однако, не используя метод IE_onQuit, описанный выше, мой код будет вызывать ту же ошибку при выполнении непосредственно через файл vbs с помощью интерпретатора Windows, поэтому ошибка не является чем-то специфичным для EVOware; просто я не могу использовать любые решения wscript из-за EVOware.

Я также попытался использовать On Error Resume Next, но это также не работает, потому что это заставляет мой скрипт попадать в бесконечный цикл и никогда не закрываться, если я не убью этот процесс в диспетчере задач.

Есть ли способ достичь моей цели (т. Е. Разрешить пользователю x-out из окна без ошибки) без использования wscript? Альтернативно, отключение кнопки 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

On Error Resume Next не работает в Do Loop в моем коде выше, является строка «Если sProtocol_Type =„“Или sNumber_of_Plates =„“Или sDispense_Volume =„“Тогда MsgBox» Все поля должны быть заполнены ! Пожалуйста, введите все значения перед отправкой. ", VbCritical" Использование On Error Resume Next приводит к тому, что оператор MsgBox создается бесконечно, пока не закончу процесс. – margentieri

ответ

0

Вы можете попробовать в начале сценария:

On Error Resume Next 

, а затем поймать коды ошибок после Quit заявления, и игнорировать один из которых вызывает это. Какая ошибка, во всяком случае?

+0

Как я уже говорил в своем OP, использование On Error Resume Next приводит к тому, что мой скрипт попадает в бесконечный цикл, если пользователь x отсутствует. Мои извинения, я забыл оставить часть кода в моем примере, которая вызывает эту проблему. В разделе «материал» является линия «Если sProtocol_Type =„“Или sNumber_of_Plates =„“Или sDispense_Volume =„“Тогда \t \t \t \t MsgBox» Все поля должны быть заполнены! Перед отправкой введите все значения.", vbCritical" Использование On Error Resume Next приводит к тому, что оператор MsgBox создается бесконечно, пока не закончу процесс. – margentieri

1

Может ли это работать?

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

Это прекрасно! Только то, что мне было нужно. Я изменил MsgBox, если утверждение, что постоянно зацикливание при использовании On Error Resume Next для «Если sProtocol_Type = "" Или sNumber_of_Plates = "" Или sDispense_Volume = "" Тогда \t Если Err.Number <> 0 Тогда \t Exit Do \t Else: MsgBox «Все поля должны быть заполнены! Пожалуйста, введите все значения перед отправкой. ", VbCritical \t Конец Если ElseIf ....." Большое спасибо! – margentieri

+0

Happy Festivus! –

Смежные вопросы