Работа с Internet Explorer (Программное сохранение файла) - VB
Формулировка задачи:
Коллеги, добрый день!
Прошу помочь мне с такой проблемой:
Делаю программку на VBA, которая лезет по ссылке на определенный сайт, "бегает" там по кнопочкам и в итоге нажимает на кнопку "сохранить файл". После этого внизу окна Интернет Эксплорера высвечивается дополнительное окно с кнопками Open, Save, Cancel (скрин прилагаю). И вот уже обратиться к этому окну у меня не получается. На диалоговое окно это не очень похоже.
Файл, который я хочу скачать, динамически обновляется на этом ресурсе каждый день, и постоянной прямой ссылки не имеет.
При помощи сканера окон удалось выявить только его класс -
Подскажите, пожалуйста, есть ли какие-то способы работы с этим окном через VBA ?
Прошу помочь мне с такой проблемой:
Делаю программку на VBA, которая лезет по ссылке на определенный сайт, "бегает" там по кнопочкам и в итоге нажимает на кнопку "сохранить файл". После этого внизу окна Интернет Эксплорера высвечивается дополнительное окно с кнопками Open, Save, Cancel (скрин прилагаю). И вот уже обратиться к этому окну у меня не получается. На диалоговое окно это не очень похоже.
Файл, который я хочу скачать, динамически обновляется на этом ресурсе каждый день, и постоянной прямой ссылки не имеет.
При помощи сканера окон удалось выявить только его класс -
DirectUIHWND
.Подскажите, пожалуйста, есть ли какие-то способы работы с этим окном через VBA ?
Решение задачи: «Работа с Internet Explorer (Программное сохранение файла)»
textual
Листинг программы
Option Explicit Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hwndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlag As Long) As Long Const VK_RETURN = &HD 'Enter Const VK_CONTROL = &H11 'Ctrl (любая) Const VK_RIGHT = &H27 'Стрелка вправо Const VK_DOWN = &H28 'Стрелка вниз Const VK_J = &H4A 'кнопка J Const WM_KEYDOWN As Long = &H100 Const WM_SETFOCUS = &H7 Public WithEvents objIE As SHDocVw.InternetExplorer Public objNewIE As Object Private Sub CommandButton1_Click() Dim Link As String Dim WinWnd, WinWnd1, WinWnd2 Dim retValue As Long ... Set objIE = New InternetExplorer Link = "https://ссылка на страницу сайта с полями логин и пароль.aspx" objIE.Navigate Link objIE.Visible = False 'делаем IE невидимым While objIE.Busy Or objIE.ReadyState <> 4 DoEvents Wend WinWnd = FindWindow(vbNullString, "заголовок окна") 'определение хэндла окна ... ввод логина, пароля и вход на сайт ... нажатие на иконку "выгрузить отчет в формате xlsx" ... While objIE.Busy DoEvents Wend 'открытие окна загрузок IE путем нажатия клавиш Ctrl+J Call PostMessage(WinWnd, WM_KEYDOWN, VK_CONTROL, 0) Call PostMessage(WinWnd, WM_KEYDOWN, VK_J, 0) 'определение хэндла окна загрузок и хэндла его дочернего окна WinWnd1 = FindWindow(vbNullString, "View Downloads - Windows Internet Explorer") retValue = SetWindowPos(WinWnd1, -1, 0, 0, 0, 0, 2) WinWnd2 = FindWindowEx(WinWnd1, 0, "DirectUIHWND", vbNullString) retValue = SetWindowPos(WinWnd2, -1, 0, 0, 0, 0, 2) 'посылаем нажатие клавиш окну загрузок Call PostMessage(WinWnd1, WM_SETFOCUS, 0, 0) Call PostMessage(WinWnd2, WM_SETFOCUS, 0, 0) Call PostMessage(WinWnd1, WM_KEYDOWN, VK_RIGHT, 0) 'направо (после этой строки окно активируется. скорее всего тут можно послать любой WM_KEYDOWN) Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RIGHT, 0) 'направо (переход с кнопки Open на кнопку Save) Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RIGHT, 0) 'направо (переход с Save на раскрывающийся список) Call PostMessage(WinWnd2, WM_KEYDOWN, VK_DOWN, 0) 'вниз (открываем раскрывающийся список) Call PostMessage(WinWnd2, WM_KEYDOWN, VK_DOWN, 0) 'вниз (переходим в раскрывающемся списке на кнопку SaveAs) Application.Wait DateAdd("s", 1.5, Now) 'таймер на 1.5 сек. Без него почему-то корректно не срабатывает нажатие на Enter в следующей строке Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RETURN, 0) 'нажатие на Enter (активация кнопки Save As). 'После этого открывается диалоговое окно с выбором каталога сохранения файла. ... End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д