Control de los botones de la ventana de diálogo IE11 “¿Desea abrir / guardar?” En VBA

Necesitamos descargar el archivo de un sitio web NASDAQ automáticamente. Mi código VBA existente abre una ventana de diálogo “¿Quieres abrir / guardar?” De IE. ¿Cómo hacer clic en ese botón de guardar y dar una ruta a través de VBA? He intentado varios métodos de API de Windows que también se describen en este enlace pero que dan como resultado “Ventana no encontrada”.

Mi código actual es el siguiente:

Sub MyIEauto() Dim ieApp As InternetExplorer Dim ieDoc As Object 'Dim ieTable As Object 'create a new instance of ie Set ieApp = New InternetExplorer 'you don't need this, but it's good for debugging ieApp.Visible = True 'assume we're not logged in and just go directly to the login page ieApp.Navigate "https://indexes.nasdaqomx.com/Account/LogOn" Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.readyState = READYSTATE_COMPLETE: DoEvents: Loop Set ieDoc = ieApp.Document 'fill in the login form – View Source from your browser to get the control names With ieDoc.forms(0) .UserName.Value = "xxxxxxx" .Password.Value = "xxxxxxx" .submit End With Do While ieApp.Busy: DoEvents: Loop Do Until ieApp.readyState = READYSTATE_COMPLETE: DoEvents: Loop 'now that we're in, go to the page we want ieApp.Navigate "https://indexes.nasdaqomx.com/Index/ExportWeightings/NDX?tradeDate=2015-08-19T00:00:00.000&timeOfDay=SOD/SODWeightings_2015" 'next below line commented as it is failing 'ieApp.ExecWB 4, 2, "D:\VBA code work\SODWeightings_20150819_NDX.xlsx" set ieApp=Nothing set ieDoc=Nothing End Sub 

La captura de pantalla a continuación muestra dónde he llegado. ¿Cómo progreso desde aquí?

enter image description here

Otra forma de hacerlo es enviar las teclas de las teclas de método abreviado para hacer clic en el botón Guardar en IE11. Debo señalar que su ventana de IE tendrá que ser la ventana activa para que esto funcione. Por lo tanto, no funcionará en el modo de depuración.

El siguiente código llama a la tecla de método abreviado. Solo estoy mostrando la tecla de acceso directo para que tengas una mejor idea de lo que está sucediendo.

  • Tecla de acceso directo: Alt + S
  • VBA: Application.SendKeys "%{S}"

Está resuelto finalmente …

 Option Explicit Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _ (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Public Sub AddReference() ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\SysWOW64\UIAutomationCore.dll" End Sub 'after my original code as posted in question then this below lines Dim o As IUIAutomation Dim e As IUIAutomationElement Set o = New CUIAutomation Dim h As Long h = ieApp.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, "Save") Dim Button As IUIAutomationElement Set Button = e.FindFirst(TreeScope_Subtree, iCnd) Dim InvokePattern As IUIAutomationInvokePattern Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId) InvokePattern.Invoke 

SendKeys fue la solución para mí.

 myfile = "C:\Users\User\Downloads\myfile.xls" checkmyfile = Dir(myfile, vbArchive) Do While checkmyfile = "" On Error Resume Next checkmyfile = Dir(myfile , vbArchive) If checkmyfile = "myfile.xls" Then Exit Do AppActivate "Title - Internet Explorer" SendKeys "%(g)" Application.Wait Now + TimeValue("0:0:1") Loop