Страницы: 1
RSS
Обработка диалоговых окон Internet explorer средствами VBA
 
Здравствуйте уважаемые, Прошу совета куда копать. Дело в следующем:
Через VBA идет обработка страницу  корпоративного сайта типа https. макросом нажимаются кнопки и т.д.
Столкнулся с проблемой обработки модального диалогового окна internet explorer. Макрос соответственно отрабатывает всё до появления окна с сообщением типа "вы точно хотите удалить?" и кнопками "ОК" и "Отмена". Т.к. окно модальное, то соответственно блокируется вся дальнейшая работа макроса до момента когда диалоговое окно будет закрыто, т.е. не возможно дальше сделать обработку через API.
Есть ли какой то обходной путь?
пример, и ссылку на сайт выкладывать нет смысла. (портал корпоративный)
 
Может глупость скажу, но я бы отслеживал появление окна по заголовку через API FindWindow или FindWindowEx и при его наличии, т.е. не нулевом хендле на нем искал кнопку "Ок" или "Отмена" и соответственно нажимал нужную программно.
 
Так покажите хоть скриншот этого модального окна

PS: Я бы макросом в коде веб-страницы в IE просто удалил бы кусок скрипта (или место вызова этого скрипта), который выводит это сообщение
И всё также работало бы, только без диалогового окна
Или можно заменить клик по кнопке (которая вызывает это окно) на выполнение команды, которая прописана в javascript на нажатие кнопки ОК
 
VSerg чтобы отследить хендл окна через через ,API FindWindow или FindWindowEx надо что бы макрос продолжал работать, а он не переходит на седующую строку кода до того как окно закроется (потому что оно модальное). с не модальными окнами получается запросто.

Игорь скриншот конечно снять можно но толку не будет. Вы сами таких окон видели миллион раз. Заголовок окна: "Сообщение с веб страницы", текст в окне: "Вы действительно хотите удалить запись?", и две кнопки "ОК" и "Отмена". при нажатии на кнопки отрабатывает скрипт на сайте (тот или иной в зависимости от ответа).

"PS: Я бы макросом в коде веб-страницы в IE просто удалил бы кусок скрипта (или место вызова этого скрипта), который выводит это сообщение"
А такое возможно на защищенных страницах https ? Если да, буду благодарен за любой пример или ссылку на разъясняющий материал.
 
Люди добрые помогите кто чем можете :)
все ещё актуально. Неужели нет решения?
 
urfin0000, вы бы все таки приложили скриншот этого окна. И вообще, макрос не может стоять из-за модального окна в IE. Или у вас не в IE работа, а в webbrowser'е?
Ведь можно сделать проверку в виде циклов Do Until, Do While, ссылаясь на состояние браузера после нажатия на кнопку.
В общем, не видя примеров, советовать что-то конкретное сложно.
 
urfin0000, не нашли решение по Вашему вопросу?
 
нашёл на просторах интернетов вот такую строку.
Код
Call IE.parentWindow.eval("window.confirm = function(){return true};window.alert = function(){};")

она вроде как должна решить проблему, но выдаёт ошибку.
что сделать чтобы она заработала?
Код
Function GetIE() As Object
For Each GetIE In CreateObject("Shell.Application").Windows() 'Loop to find
If (Not GetIE Is Nothing) And GetIE.Name = "Internet Explorer" Then Exit For 'Found!
Next GetIE
If GetIE Is Nothing Then Exit Function
GetIE.Visible = True 'Make IE window visible
End Function
 
Sub upload()
Dim ie As Object
Set ie = GetIE

Call ie.parentWindow.eval("window.confirm = function(){return true};window.alert = function(){};")
....
End Sub
Изменено: Максим - 04.06.2019 13:06:56
 
Максим, его выполнить надо после загрузки документа, т.е. html страница должна полностью прогрузиться сначала.
А лучше всего показывать ошибку.
 
Ошибка runtime error 438
object doesn't support this property or method
Код
Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long

Sub export_sout()
    Dim IE As Object
'    Dim IE As SHDocVw.InternetExplorer
    Set IE = GetIE
    IE.Visible = True
Set IEDoc = IE.document
SetForegroundWindow IE.hwnd
ShowWindow IE.hwnd, 3 ' SW_SHOWMAXIMIZED = 3
IE.Navigate ("https:/....."), 2             '2=don't keep history
Do: DoEvents: Loop While IE.Busy Or IE.ReadyState <> 4 'wait til loaded
Call IE.parentWindow.eval("window.confirm = function(){return true};window.alert = function(){};")
...
End Sub
Изменено: Максим - 04.06.2019 14:43:19
 
Цитата
Максим написал:
Ошибка runtime error 438 object doesn't support this property or method
Удалось решить данную проблему? Т.к. тоже застрял на этапе, что вызывается диалоговое окно и код тормозится
Страницы: 1
Наверх