VBA Internet Explorer Automation - Как выбрать "Открыть" при загрузке файла

Это мой первый вопрос из stackoverflow!

Я искал решение этой проблемы некоторое время и не нашел никакой помощи. Возможно, я просто использую неправильные ключевые слова в своих поисках, но до сих пор мне не повезло. Здесь вопрос:

В VBA, как я могу выбрать опцию "Открыть" в диалоговом окне загрузки файлов в Internet Explorer?

Просто для дополнительного разъяснения я говорю о желто-оранжевой полосе, которая появляется в нижней части экрана в IE9 при загрузке файла.

Я делаю автоматизацию VBA для загрузки сотен PDF файлов из Интернета с помощью Internet Explorer, но есть промежуточный шаг, на котором должен быть открыт файл .fdf, прежде чем я попаду в фактический PDF файл. Поэтому мне сначала нужно выбрать опцию "Открыть", чтобы я мог перейти к следующему этапу автоматизации. Как я уже говорил, я много раз искал и не повезло до сих пор.

Я пробовал использовать SendKeys в надежде на то, что нажатие Enter будет работать, и это было последним усилием, которое не срабатывало.

Заранее благодарим за помощь!

Ответ 1

Я подробно рассмотрел это здесь.

Тема: Кнопка открытия/сохранения/отмены VBA/VB.Net/VB6-Click в окне загрузки IE - ЧАСТЬ I

Ссылка: http://www.siddharthrout.com/2011/10/23/vbavb-netvb6click-opensavecancel-button-on-ie-download-window/

и


EDIT (IMP) Если вы используете IE 9 Не забудьте прочитать ЧАСТЬ 2, поскольку она включает и охватывает структуру окна окна загрузки IE 9


Тема: Кнопка открытия/сохранения/отмены VBA/VB.Net/VB6-Click в окне загрузки IE - ЧАСТЬ II

Ссылка: http://www.siddharthrout.com/2012/02/02/vbavb-netvb6click-opensavecancel-button-on-ie-download-window-part-ii/

В приведенных выше ссылках обсуждается, как использовать API для достижения того, чего вы хотите.

Из первой ссылки...

Как и вы и я, у нас обоих есть имена, аналогично, окна имеют "дескрипторы" (hWnd), класс и т.д. Как только вы знаете, что это за hWnd, легче взаимодействовать с этим окном.

API Findwindow находит hWnd конкретного окна, используя в этом случае имя класса и заголовок окна ( "Загрузка файла" ). Кнопки "Открыть", "Сохранить" и "Отмена" являются самими окнами, но они являются дочерними окнами главного окна, которое является "Загрузка файла". Это означает, что каждый из них также будет иметь hWnd:). Чтобы найти дочерние окна, мы не используем FindWindow, а используем FindWindowEx. Все три кнопки "Открыть", "Сохранить" и "Отменить" имеют тот же класс, что и "Кнопка".

Ответ 2

Похожие сообщения: ссылка

    Option Explicit
    Dim ie As InternetExplorer
    Dim h As LongPtr
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub Download()
    Dim o As IUIAutomation
    Dim e As IUIAutomationElement
    Set o = New CUIAutomation
    h = ie.Hwnd
    h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
    If h = 0 Then Exit Sub

    Set e = o.ElementFromHandle(ByVal h)
    Dim iCnd As IUIAutomationCondition
    Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Open")

    Dim Button As IUIAutomationElement
    Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
    Dim InvokePattern As IUIAutomationInvokePattern
    Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
    InvokePattern.Invoke
End Sub 

Ответ 3

Я отправил ярлыки в приложение. Вот они для IE11. Извините, я не смог протестировать IE9. Если вы удерживаете Alt, он может показать вам другой ключ для комбо, как это делает IE11.

Примечание: код не будет работать, как вы ожидаете, если IE не является активным окном на вашем компьютере, поэтому он не будет работать в режиме отладки.

  • Горячая клавиша: Alt + O
  • VBA: Application.SendKeys "%{O}"