Нажатие кнопки загрузки Excel в Интернете с помощью VBA - PullRequest
1 голос
/ 11 июля 2020

Моя цель - нажать кнопку загрузки Excel на этом веб-сайте. Я все время получаю "Ошибка автоматизации. Интерфейс неизвестен в моих циклах while.

Sub GetData()
Dim IE As InternetExplorerMedium
Dim HTMLDoc As HTMLDocument
Dim objElement As HTMLObjectElement

Set IE = New InternetExplorerMedium
With IE
    .Visible = True
    .Navigate "https://www.pimco.com/en-us/investments/mutual-funds"
    Do While .readyState = 4: DoEvents: Loop
    Do Until .readyState = 4: DoEvents: Loop
    .document.getElementById("csvLink").Click
End With

Set IE = Nothing
End Sub

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Некоторые объяснения причин возникновения проблем:

  • Не используйте InternetExplorerMedium.
    • Проблема в том, что IE открывается дважды. После первого открытия он сразу же снова закрывается, а URL-адрес загружается в другом экземпляре. Но этот экземпляр больше не назначается переменной IE, и макрос не может ссылаться на него. Вы можете наблюдать это, когда выполняете свой макрос. IE кажется дергается один раз.
  • Строки Do While .readyState = 4: DoEvents: Loop и Do Until .readyState = 4: DoEvents: Loop ждут противоположной стороны.
    • 4 говорит, что страница загружена . Таким образом, вы можете использовать Do While .readyState <> 4: DoEvents: Loop или Do Until .readyState = 4: DoEvents: Loop. Одного из обоих циклов достаточно.
  • Страница загружает динамическое c содержимое после IE отчетов завершено .
    • По этой причине вы должны прервать работу, пока это содержимое не загрузится. Самый простой способ сделать это - сделать тяжелый перерыв. Посмотрите на эту часть кода ниже.
  • Вы должны запустить загрузку.
    • Для этого вам понадобится Sendkeys (). Это нехорошо, но здесь вряд ли можно избежать. Я не думаю, что существует прямая ссылка для загрузки, как предполагает Пейтер, потому что я предполагаю, что файл для загрузки создается только по запросу на основе отображаемых данных страницы. По крайней мере, это мой опыт с такими загрузками.
    • Пожалуйста, прочтите комментарии в макросе, который я написал над строкой Sendkeys (), чтобы потом найти загруженный файл на вашем компьютере.

Вот работающий код:

Sub GetData()
  Dim IE As Object
  
  Set IE = CreateObject("internetexplorer.application")
  IE.Visible = True
  IE.Navigate "https://www.pimco.com/en-us/investments/mutual-funds"
  Do Until IE.readyState = 4: DoEvents: Loop
  'Manual break to load dynamic content after
  'the IE reports the ready state 'complete' (4)
  'The last three values are hours, minutes, seconds
  Application.Wait (Now + TimeSerial(0, 0, 10))
  
  'Now we can click the button
  IE.document.getElementById("csvLink").Click
  
  'Here you need sendkeys to trigger the save button
  'Don't touch anything while the code runs
  'Sendkeys will send the key combination in the brackets
  'to the application which has the focus
  'The file will be saved to your standard donload directory
  'or to the download directory you placed in the IE settings
  'if you did that
  Application.SendKeys ("%{S}")
  
  'Clean up
  IE.Quit
  Set IE = Nothing
End Sub
0 голосов
/ 11 июля 2020

Вот набор функций, которые вы можете использовать для очистки кода. { ссылка }

Я бы не стал пытаться втиснуть все это в предложение With.

Я бы хотел разбить каждый шаг на его собственный сегмент с функциями.

Затем проверьте состояние готовности и убедитесь, что элемент существует, прежде чем щелкнуть по нему, используя обработку ошибок.

При этом я собираюсь сказать, что вы, вероятно, можете пропустить загрузку IE проводника и получите ссылку напрямую, используя запросы XMLHTTP. Итак, откройте страницу в chrome, включите DevTools, обновите sh страницу, загрузите CSV и начните просматривать сетевые запросы.

Вы найдете тот, который представляет загруженный файл, и скорее всего, это прямая ссылка, которую вы затем можете использовать с параметрами, чтобы позволить XMLHTTP пропускать содержимое страницы и каждый раз получать файл, не беспокоясь о таких элементах загрузки, как CSS / formatting / fonts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...